std:: vector
|
Определено в заголовочном файле
<vector>
|
||
|
template
<
class
T,
|
(1) | |
|
namespace
pmr
{
template
<
class
T
>
|
(2) | (начиная с C++17) |
std::vector
— это контейнер-последовательность, инкапсулирующий массивы динамического размера.
За исключением
std::vector<bool>
частичной специализации, элементы хранятся непрерывно, что означает, что к элементам можно обращаться не только через итераторы, но и используя смещения к обычным указателям на элементы. Это означает, что указатель на элемент вектора может быть передан в любую функцию, которая ожидает указатель на элемент массива.
Хранение вектора обрабатывается автоматически, расширяясь по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, потому что выделяется дополнительная память для обработки будущего роста. Таким образом, вектору не требуется перераспределять память каждый раз при вставке элемента, а только когда дополнительная память исчерпана. Общий объем выделенной памяти можно запросить с помощью функции capacity() . Дополнительная память может быть возвращена системе с помощью вызова shrink_to_fit() [1] .
Перераспределения обычно являются затратными операциями с точки зрения производительности. Функция reserve() может быть использована для исключения перераспределений, если количество элементов известно заранее.
Сложность (эффективность) стандартных операций с векторами следующая:
- Произвольный доступ - константная сложность 𝓞(1) .
- Вставка или удаление элементов в конце - амортизированная константная сложность 𝓞(1) .
- Вставка или удаление элементов - линейная сложность относительно расстояния до конца вектора 𝓞(n) .
std::vector
(для
T
отличного от
bool
) удовлетворяет требованиям
Container
,
AllocatorAwareContainer
(начиная с C++11)
,
SequenceContainer
,
ContiguousContainer
(начиная с C++17)
и
ReversibleContainer
.
Все функции-члены
std::vector
являются
constexpr
: возможно создавать и использовать объекты
std::vector
при вычислении константного выражения.
Однако, объекты
|
(начиная с C++20) |
-
↑
В libstdc++,
shrink_to_fit()недоступен в режиме C++98.
Содержание |
Параметры шаблона
| T | - |
Тип элементов.
|
||||||||||||||
| Allocator | - |
Аллокатор, который используется для выделения/освобождения памяти и для создания/уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям
Allocator
.
Поведение не определено
(до C++20)
Программа некорректна
(с C++20)
если
Allocator::value_type
не совпадает с
T
.
|
Специализации
Стандартная библиотека предоставляет специализацию
std::vector
для типа
bool
, которая может быть оптимизирована для эффективного использования памяти.
|
эффективное по памяти динамическое битовое множество
(специализация шаблона класса) |
Инвалидация итераторов
| Операции | Инвалидируются |
|---|---|
| Все операции только для чтения | Никогда. |
| swap , std::swap | end() |
| clear , operator= , assign | Всегда. |
| reserve , shrink_to_fit | Если вектор изменил емкость, все. Если нет, ничего. |
| erase | Удаленные элементы и все элементы после них (включая end() ). |
| push_back , emplace_back | Если вектор изменил емкость, все. Если нет, только end() . |
| insert , emplace |
Если вектор изменил емкость, все.
Если нет, только те, которые находятся в точке вставки или после нее (включая end() ). |
| resize | Если вектор изменил емкость, все. Если нет, только end() и любые удаленные элементы. |
| pop_back | Удаленный элемент и end() . |
Типы членов
| Тип члена | Определение | ||||
value_type
|
T
|
||||
allocator_type
|
Allocator
|
||||
size_type
|
Беззнаковый целочисленный тип (обычно std::size_t ) | ||||
difference_type
|
Знаковый целочисленный тип (обычно std::ptrdiff_t ) | ||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
Функции-члены
конструирует
vector
(публичная функция-член) |
|
уничтожает
vector
(публичная функция-член) |
|
|
присваивает значения контейнеру
(публичная функция-член) |
|
|
присваивает значения контейнеру
(публичная функция-член) |
|
|
(C++23)
|
присваивает диапазон значений контейнеру
(публичная функция-член) |
|
возвращает связанный аллокатор
(публичная функция-член) |
|
Доступ к элементам |
|
|
доступ к указанному элементу с проверкой границ
(публичная функция-член) |
|
|
доступ к указанному элементу
(публичная функция-член) |
|
|
доступ к первому элементу
(публичная функция-член) |
|
|
доступ к последнему элементу
(публичная функция-член) |
|
|
прямой доступ к базовому непрерывному хранилищу
(публичная функция-член) |
|
Итераторы |
|
|
(C++11)
|
возвращает итератор на начало
(публичная функция-член) |
|
(C++11)
|
возвращает итератор на конец
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на начало
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на конец
(публичная функция-член) |
Ёмкость |
|
|
проверяет, является ли контейнер пустым
(публичная функция-член) |
|
|
возвращает количество элементов
(публичная функция-член) |
|
|
возвращает максимально возможное количество элементов
(публичная функция-член) |
|
|
резервирует память
(публичная функция-член) |
|
|
возвращает количество элементов, которое может содержаться в выделенной в данный момент памяти
(публичная функция-член) |
|
|
(
DR*
)
|
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная функция-член) |
Модификаторы |
|
|
очищает содержимое
(публичная функция-член) |
|
|
вставляет элементы
(публичная функция-член) |
|
|
(C++23)
|
вставляет диапазон элементов
(публичная функция-член) |
|
(C++11)
|
создаёт элемент на месте
(публичная функция-член) |
|
удаляет элементы
(публичная функция-член) |
|
|
добавляет элемент в конец
(публичная функция-член) |
|
|
(C++11)
|
создаёт элемент на месте в конце
(публичная функция-член) |
|
(C++23)
|
добавляет диапазон элементов в конец
(public member function) |
|
удаляет последний элемент
(публичная функция-член) |
|
|
изменяет количество хранимых элементов
(публичная функция-член) |
|
|
обменивает содержимое
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
vector
ов
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) |
Руководства по выводу |
(начиная с C++17) |
Примечания
| Feature-test макрос | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Конструкция и вставка диапазонов для контейнеров |
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) |
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++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 69 | C++98 |
непрерывность хранения элементов
vector
не требовалась
|
требуется |
| LWG 230 | C++98 |
T
не требовалось быть
CopyConstructible
(элемент типа
T
мог быть неконструируемым)
|
T
также требуется
быть CopyConstructible |
| LWG 464 | C++98 |
доступ к базовому хранилищу пустого
vector
приводил к неопределённому поведению
|
предоставлена функция
data
|
Смотрите также
|
(C++26)
|
изменяемый массив фиксированной ёмкости с размещением на месте
(шаблон класса) |
|
(C++11)
|
массив фиксированного размера с размещением на месте
(шаблон класса) |
|
двусторонняя очередь
(шаблон класса) |