За исключением
std::vector<bool>
частичной специализации, элементы хранятся непрерывно, что означает, что к элементам можно обращаться не только через итераторы, но и используя смещения к обычным указателям на элементы. Это означает, что указатель на элемент вектора может быть передан в любую функцию, которая ожидает указатель на элемент массива.
Хранение вектора обрабатывается автоматически, расширяясь по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, потому что выделяется дополнительная память для обработки будущего роста. Таким образом, вектору не требуется перераспределять память каждый раз при вставке элемента, а только когда дополнительная память исчерпана. Общий объем выделенной памяти можно запросить с помощью функции
capacity()
. Дополнительная память может быть возвращена системе с помощью вызова
shrink_to_fit()
[1]
.
Перераспределения обычно являются затратными операциями с точки зрения производительности. Функция
reserve()
может быть использована для исключения перераспределений, если количество элементов известно заранее.
Сложность (эффективность) стандартных операций с векторами следующая:
Произвольный доступ - константная сложность
𝓞(1)
.
Вставка или удаление элементов в конце - амортизированная константная сложность
𝓞(1)
.
Вставка или удаление элементов - линейная сложность относительно расстояния до конца вектора
𝓞(n)
.
Все функции-члены
std::vector
являются
constexpr
: возможно создавать и использовать объекты
std::vector
при вычислении константного выражения.
Однако, объекты
std::vector
обычно не могут быть
constexpr
, поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.
Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента был полным типом и удовлетворял требованиям
Erasable
, но многие функции-члены накладывают более строгие требования.
(с C++11)
(до C++17)
Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Обычно требуется, чтобы тип элемента удовлетворял требованиям
Erasable
, но многие функции-члены накладывают более строгие требования. Этот контейнер (но не его члены) может быть инстанцирован с неполным типом элемента, если аллокатор удовлетворяет
требованиям полноты аллокатора
.
Аллокатор, который используется для выделения/освобождения памяти и для создания/уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям
Allocator
.
Поведение не определено
(до C++20)
Программа некорректна
(с C++20)
если
Allocator::value_type
не совпадает с
T
.
Специализации
Стандартная библиотека предоставляет специализацию
std::vector
для типа
bool
, которая может быть оптимизирована для эффективного использования памяти.
ranges::approximately_sized_range
,
ranges::reserve_hint
и изменения в
std::vector
Пример
Запустить этот код
#include <iostream>#include <vector>int main(){// Создаем вектор, содержащий целые числа
std::vector<int> v ={8, 4, 5, 9};// Добавляем еще два целых числа в вектор
v.push_back(6);
v.push_back(9);// Перезаписываем элемент в позиции 2
v[2]=-1;// Выводим векторfor(int n : v)std::cout<< n <<' ';std::cout<<'\n';}
Вывод:
8 4 -1 9 6 9
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.