Главная » C++, C++ Builder » Работа с векторами (массивами) STL

0

В библиотеке STL массивы переменной длины представлены классом vector, который предоставляет доступ к элементам любого типа (правда, только к одному типу в одном объекте vector) последовательно или случайным доступом. Такие объекты используются в вашем приложении всюду, где бы вы обычно писали объявления массива элементов этого типа. Например, если бы вам нужно было хранить 100 целых чисел, то в вашей программе могло бы быть такое выражение:

int nItems [100];

Однако, это выражение склонно к ошибкам. Что, если позднее вы поймете, что вам на самом деле нужно хранить 200 элементов? Вы можете использовать выделенный блок памяти, например так:

int *pnItems = new int [100];

Тогда, если вам потребуется больший массив, вы можете сделать что-нибудь подобное: delete pnItems;

pnItems = new int [nSomeNewSize] ;

Проблема здесь в том, что когда вы удаляете все эти элементы, то вы теряете значения, которые они содержали. Как альтернативу, вы можете вернуться к старым функциям malloc и free в стиле языка C:

int *pnItems = (int *)malloc (100 * sizeof(int) );

Тогда перераспределение элементов возможно с помощью функции realloc: int *pnItems = realloc (pnItems, nSomeNewSize * sizeof(int) );

В этом подходе тоже есть проблемы. Во-первых, вам надо не забыть включить размер целого при выделении памяти. Во-вторых, нет способа определить, были ли освобождены элементы. И наконец, удобнее работать с new и delete, чем с malloc и free. Все эти  причины  достаточно серьезны, так что STL содержит полную шаблонную реализацию массива в классе vector. В предыдущем примере мы бы заменили описание массива следующим выражением:

vector<int> nItems;

Это выделяет переменный массив целых. Для добавления элементов в массив используйте метод

insert:

nItems.insert (nItems.end(), 12 )

Это выражение добавит значение 12 в конец массива. Если вы уже установили значение, то вы можете обращаться к нему для чтения или записи, используя оператор []. Например, представьте, что у нас были следующие выражения, устанавливающие значения элементов массива:

nItems.insert (nItems.end(), 1 ); nItems.insert (nItems.end(), 2 ); nItems.insert (nItems.end(), 3 ); nItems.insert (nItems.end(), 4 );

Это  устанавливает  четыре  элемента  массива  в значения от 1  до  4.  Тогда мы  можем  изменить третий элемент массива, используя оператор [] и индекс элемента (начиная с 0):

nItems[2] = 5; count << nItems[2];

Два предыдущих выражения присвоят третьему элементу массива значение 5 и затем выведут (в стандартный выходной поток) значение этого элемента. Этот пример напечатает значение 5.

В  табл. 5.2  приведены  наиболее  важные  методы  класса  vector  вместе  с  объяснением,  что  эти методы делают.

Таблица 5.2 Важные методы класса vector

Insert

Добавляет данные в массив

Size

Возвращает текущее количество элементов в массиве

operator[]

Дает доступ к элементу массива по его индексу для чтения или записи

operator=(vector)

Копирует один массив в другой

at

То же, что и operator[]

begin

Возвращает начало массива

end

Возвращает конец массива

capacity

Возвращает выделенный размер массива. Может отличаться от size, если есть резерв

reserve

Выделяет память под фиксированное число элементов, которое может быть изменено во время выполнения

empty

Указывает, содержит (FALSE) или нет (TRUE) массив элементы

erase

Удаляет элементы из массива

count

Вспомогательная функция, которая считает количество элементов данного типа в массиве

max_size

Возвращает максимально возможный размер для массива. Обычно это количество свободной

памяти массива. Обычно это количество свободной памяти

swap

Позволяет двум массивам быстро и эффективно обменяться данными

resize

Изменяет размер массива на новое заданное число элементов, с необязательным параметром для инициализации начальных значений

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии