Программирование PC C++: шаблон класса std::vector Tue, April 16 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

C++: шаблон класса std::vector Печать
Добавил(а) microsin   

Векторы (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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page