Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 9

Каждый контейнер, в том числе и вектор, имеет свои собственные функции (методы), позволяющие выполнять определенный круг базо-вых операций. Однако алгоритмы STL,обрабатывающие данные, содержащиеся в контейнерах, позволяют выполнять более расширен-ные или более сложные действия.

Вектор обеспечивает произвольный доступ к своим элементам. Итераторы векторов – это итераторы произвольного доступа, что позволяет применять к векторам все алгоритмы STL.

Чтобы использовать вектор в программе, необходимо включить в нее заголовочный файл <vector>:

#include <vector>

Объявление вектора выглядит следующим образом:

vector<тип_элемента> имя; Например,

vector<int> n; n вектор, который может хранить целые числа.

При объявлении вектора его можно одновременно и инициализировать (табл. 1).

Таблица 1

Способы инициализации векторов

Операция

Описание

vector <Type> v

Создает пустой вектор, не содержащий ни одного элемента

vector<Type> v1(v2)

Создает копию другого вектора того же типа (с копированием всех элементов)

vector<Type> v(n)

Создает вектор из  n  элементов, создаваемых конструктором по умолчанию

vector<Type> v(n,elem)

Создает вектор, инициализируемый n копиями элемента  elem

Здесь Type – тип элементов вектора.

Пример 2

#include <vector>

void main()

setlocale(LC_ALL,"rus_rus.1251");

vector<int> v; // Создаем пустой вектор

vector<int> v1(10); // Cоздаем вектор из десяти элементов,

// начальные значения которых равны нулю

for(int i = 0; i < 10; i++) v1[i] = (i+1)*(i+1);//Заполняем вектор v1

vector<int>v3(v1);// Копируем вектор  v1  в вектор  v3;

v=v3;// Присваиваем элементам вектора v значения элеметов

// вектора v3

cout<<"\nЭлементы вектора v"<<endl;

for(int i = 0; i < 10; i++) cout<<setw(5)<<v[i];

}

Результат

Элементы вектора  v

1    4    9    16    25    36    49    64    81    100

 
Одной из самых замечательных особенностей контейнеров STL является автоматическое наращивание памяти в соответствии с объемом внесенных данных. Чтобы разобраться с этим вопросом, остановимся более подробно на функциях size, capacity и reserve(n) (табл. 2).

Таблица 2

Немодифицирующие операции над векторами

Операция

Описание

v.size()

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

v.empty()

Возвращает true, если контейнер пуст, и false в противном случае

v.max_size()

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

v.capacity()

Возвращает количество зарезервированной (выделенной) памяти

v.reserve(n)

Резервирует память, необходимую для добавления  n  элементов в вектор

Функция size возвращает текущее количество элементов в контейнере. Она не сообщает, сколько памяти контейнер выделил для хранящихся в нем элементов.

Функция capacity сообщает, сколько элементов поместится в выделенной памяти. Речь идет об общем количестве элементов, а не о том, сколько еще элементов можно разместить без расширения контейнера. Если size и capacity возвращают одинаковые значения, значит, в контейнере не осталось свободного места, и следующая вставка (insert, push_back и т. д., см. пример 6) даже одного элемента вызовет процедуру перераспределения памяти, которая порой обходится довольно дорого (при больших объемах). Естественно, эту операцию хотелось бы выполнять как можно реже, тем более что при каждом выполнении перечисленных операций все итераторы, указатели и ссылки на содержимое vector становятся недействительными. Для решения этой проблемы надо использовать функцию  reserve( n).