Векторы (vector) это последовательность контейнеров, представляющих массивы, размер которых можно изменять во время работы программы (runtime).
Точно так же, как и массивы, векторы используют непрерывное хранилище в памяти для своих элементов (элементы следуют друг за другом без пропусков). Это означает, что элементы векторов могут быть доступны не только через итератор, но и с помощью смещения (использования обычных указателей), как это эффективно реализуется с массивами. Однако в отличие от массивов, размер векторов можно менять динамически, причем обслуживание хранилища осуществляется автоматически контейнером.
Внутри себя векторы для хранения своих элементов используют динамически выделенный массив. В процессе роста этот массив требует своего повторного выделения. Это происходит каждый раз, когда добавляются новые элементы, при этом все элементы перемещаются в заново выделенный массив. Эта задача довольно затратная с точки зрения процессорного времени, поэтому иногда используется упреждающее выделение памяти для вектора, когда переразмещение массива его хранилища делается не каждый раз при добавлении нового элемента в контейнер. По этой причине реальный размер контейнера может быть больше, чем требуется для хранения элементов вектора. Библиотеки могут реализовывать разные стратегии для роста контейнера для обеспечения баланса между использованием памяти и повторными выделениями. Однако в любом случае повторные выделения должны происходить с логарифмически растущими интервалами размера, так чтобы вставка отдельных элементов в конец вектора можно было предоставить амортизируемую постоянную сложность вычислений в контексте затрат процессорного времени (см. push_back). Таким образом, в сравнении с массивами векторы потребляют больше памяти с целью повысить эффективность работы по обслуживанию хранилища в случаях, когда растет количество элементов.
Если сравнивать с другими динамическими хранилищами последовательности - двусторонними очередями (deque) и списками (list, forward_list), векторы обеспечивают очень эффективный доступ к своим элементам (такой же эффективный, как у массивов), и относительно эффективное добавление или удаление элементов в своем конце. Для операций, которые вовлекают вставку или удаление элементов в позиции, не совпадающие с концом, векторы работают хуже других, и имеют менее целостные итераторы и ссылки, чем списки list и forward_list.
[Основные свойства контейнера]
Последовательность. Элементы в контейнере vector всегда имеют строго упорядоченную, линейную последовательность. К отдельным элементам можно получить доступ по номеру их позиции в последовательности (т. е. по индексу, как в массиве).
Динамический массив. Позволяет осуществить доступ к любому элементу последовательности даже через арифметику указателей, и предоставляет относительно быстрое добавление/удаление элементов в конце последовательности.
Проблемы выделения памяти. Контейнер использует объект выделения памяти (allocator object) для динамического обслуживания своего хранилища по мере необходимости.
[Параметры шаблона]
T Тип элементов. Только с теми типами, которые не выбрасывают исключение при физическом перемещении по памяти [2], гарантируется оптимизация, которая применяет перемещение данных элементов вместо их копирования (при переразмещении хранилища). Псевдоним для доступа как члену класса vector::value_type.
Alloc Тип объекта allocator используется для определения модели выделения памяти для хранилища. По умолчанию используется шаблон класса allocator [3], который определяет простейший принцип выделения памяти, независимый от значения. Псевдоним для доступа как члену класса vector::allocator_type.
[Поля]
C++98
Поле |
Определение |
Примечание
|
value_type |
Первый параметр шаблона (T) |
|
allocator_type
|
Второй параметр шаблона (Alloc) |
По умолчанию: allocator< value_type> |
reference
|
allocator_type::reference |
Для allocator по умолчанию: value_type& |
const_reference
|
allocator_type::const_reference |
Для allocator по умолчанию: const value_type& |
pointer
|
allocator_type::pointer |
Для allocator по умолчанию: value_type* |
const_pointer
|
allocator_type::const_pointer |
Для allocator по умолчанию: const value_type* |
iterator
|
Итератор произвольного доступа к элементам вектора типа value_type |
Может быть преобразован к const_iterator |
const_iterator
|
Итератор произвольного доступа к элементам вектора типа const value_type |
|
reverse_iterator
|
reverse_iterator< iterator> |
|
const_reverse_iterator
|
reverse_iterator< const_iterator> |
|
difference_type
|
Целочисленный тип со знаком, идентичный: iterator_traits< iterator>::difference_type |
Обычно то же самое, что и ptrdiff_t |
size_type
|
Целочисленный тип без знака, который может представить любое неотрицательное значение difference_type |
Обычно то же самое, что и size_t |
C++11
Поле |
Определение |
Примечание
|
value_type |
Первый параметр шаблона (T) |
|
allocator_type
|
Второй параметр шаблона (Alloc) |
По умолчанию: allocator< value_type> |
reference
|
value_type& |
|
const_reference
|
const value_type& |
|
pointer
|
allocator_traits< allocator_type>::pointer |
Для allocator по умолчанию: value_type* |
const_pointer
|
allocator_traits< allocator_type>::const_pointer |
Для allocator по умолчанию: const value_type* |
iterator
|
Итератор произвольного доступа к элементам вектора типа value_type |
Может быть преобразован к const_iterator |
const_iterator
|
Итератор произвольного доступа к элементам вектора типа const value_type |
|
reverse_iterator
|
reverse_iterator< iterator> |
|
const_reverse_iterator
|
reverse_iterator< const_iterator> |
|
difference_type
|
Целочисленный тип со знаком, идентичный: iterator_traits< iterator>::difference_type |
Обычно то же самое, что и ptrdiff_t |
size_type
|
Целочисленный тип без знака, который может представить любое неотрицательное значение difference_type |
Обычно то же самое, что и size_t |
[Функции]
Функция |
Описание |
Конструктор |
Создает экземпляр шаблона vector. |
Деструктор |
Уничтожает экземпляр шаблона vector. |
operator= |
Присваивает содержимое. |
Итераторы: |
begin |
Возвращает позицию итератора в начало. |
end |
Переводит позицию итератора в конец. |
rbegin |
Возвращает позицию обратного итератора к обратному началу. |
rend |
Переводит позицию обратного итератора к обратному концу. |
cbegin |
Возвращает позицию const-итератора в начало (только для C++11). |
cend |
Переводит позицию const-итератора в конец (только для C++11). |
crbegin |
Возвращает позицию обратного const-итератора к обратному началу (только для C++11). |
crend |
Переводит позицию обратного const-итератора к обратному концу (только для C++11). |
Работа с емкостью хранилища: |
size |
Возвратит размер. |
max_size |
Возвратит максимальный размер. |
resize |
Изменяет размер. |
capacity |
Вернет размер выделенного хранилища. |
empty |
Проверит vector на пустоту. |
reserve |
Запрос на изменение емкости хранилища. |
shrink_to_fit |
Обрезка хранилища по полезному содержимому (только для C++11). |
Доступ к элементам: |
operator[] |
Доступ к произвольному элементу. |
at |
front |
Доступ к первому элементу. |
back |
Доступ к последнему элементу. |
data |
Доступ к данным (только для C++11). |
Модификаторы: |
assign |
Присвоение содержимого vector. |
push_back |
Добавление элемента в конец. |
pop_back |
Удаление последнего элемента. |
insert |
Вставка элементов. |
erase |
Стирание элементов. |
swap |
Перестановка содержимого. |
clear |
Очистка содержимого. |
emplace |
Конструирование и вставка элемента. |
emplace_back |
Конструирование и вставка элемента в конец. |
Allocator: |
get_allocator |
Получение объекта для выделения памяти. |
[Перегрузки функций, не относящихся к экземпляру]
Функция |
Описание |
relational-операторы |
Операторы отношения для vector (функция шаблона). |
swap |
Обмен содержимого vector-ов (функция шаблона). |
[Специализации шаблона]
Функция |
Описание |
vector< bool> |
Вектор значений bool (специализация шаблона класса). |
[Ссылки]
1. std::vector site:cplusplus.com. 2. std::is_nothrow_move_constructible site:cplusplus.com. 3. std::allocator site:cplusplus.com. |