std::vector — cppreference.com
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
(1) | |
|
|
(2) | (начиная с C++17) |
1) std::vector это последовательный контейнер, инкапсулирующий массивы переменного размера.
Элементы хранятся непрерывно, а значит доступны не только через итераторы, но и с помощью смещений для обычных указателей на элементы. Это означает, что указатель на элемент вектора может передаваться в любую функцию, ожидающую указатель на элемент массива.
Память вектора обрабатывается автоматически, расширяясь по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, поскольку больше памяти выделяется для обработки будущего роста. Таким образом, память для вектора требуется выделять не при каждой вставке элемента, а только после исчерпания дополнительной памяти. Общий объём выделенной памяти можно получить с помощью функции capacity(). Дополнительную память можно вернуть системе с помощью вызова shrink_to_fit()[1].
Перераспределение обычно является дорогостоящей операцией с точки зрения производительности. Функцию reserve() можно использовать для исключения перераспределения, если количество элементов известно заранее.
Сложность (эффективность) обычных операций над векторами следующая:
- Произвольный доступ — постоянная 𝓞(1).
- Вставка и удаление элементов в конце — амортизированная постоянная 𝓞(1).
- Вставка и удаление элементов — линейная по расстоянию до конца вектора 𝓞(n).
std::vector (для T кроме bool) соответствует требованиям Container, AllocatorAwareContainer, SequenceContainer , ContiguousContainer (начиная с C++17) и ReversibleContainer.
|
Функции-элементы Однако объекты |
(начиная с 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 (public функция-элемент) [править] | |
уничтожает vector (public функция-элемент) [править] | |
| присваивает значения контейнеру (public функция-элемент) [править] | |
| присваивает значения контейнеру (public функция-элемент) [править] | |
(C++23) |
присваивает диапазон значений контейнеру (public функция-элемент) [править] |
| возвращает связанный аллокатор (public функция-элемент) [править] | |
Доступ к элементам | |
| предоставляет доступ к указанному элементу с проверкой границ (public функция-элемент) [править] | |
| предоставляет доступ к указанному элементу (public функция-элемент) [править] | |
| предоставляет доступ к первому элементу (public функция-элемент) [править] | |
| предоставляет доступ к последнему элементу (public функция-элемент) [править] | |
| прямой доступ к базовому массиву (public функция-элемент) [править] | |
Итераторы | |
(C++11) |
возвращает итератор на начало (public функция-элемент) [править] |
(C++11) |
возвращает итератор на конец (public функция-элемент) [править] |
(C++11) |
возвращает обратный итератор на начало (public функция-элемент) [править] |
(C++11) |
возвращает обратный итератор на конец (public функция-элемент) [править] |
Ёмкость | |
| проверяет, пуст ли контейнер (public функция-элемент) [править] | |
| возвращает количество элементов (public функция-элемент) [править] | |
| возвращает максимально возможное количество элементов (public функция-элемент) [править] | |
| резервирует память (public функция-элемент) [править] | |
| возвращает количество элементов, которые могут храниться в выделенной в данный момент памяти (public функция-элемент) [править] | |
(DR*) |
уменьшает использование памяти за счёт освобождения неиспользуемой памяти (public функция-элемент) [править] |
Модификаторы | |
| очищает содержимое (public функция-элемент) [править] | |
| вставляет элементы (public функция-элемент) [править] | |
(C++23) |
вставляет ряд элементов (public функция-элемент) [править] |
(C++11) |
создаёт элемент на месте (public функция-элемент) [править] |
| удаляет элементы (public функция-элемент) [править] | |
| добавляет элемент в конец (public функция-элемент) [править] | |
(C++11) |
создаёт элементы на месте в конце (public функция-элемент) [править] |
(C++23) |
добавляет диапазон элементов в конец (public функция-элемент) [править] |
| удаляет последний элемент (public функция-элемент) [править] | |
| изменяет количество хранимых элементов (public функция-элемент) [править] | |
| обменивает содержимое (public функция-элемент) [править] | |
Функции, не являющиеся элементами
Примечание
| Макрос тест функциональности | Значение | Стандарт | Комментарий |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Создание и вставка диапазонов для контейнеров |
Пример
#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'; }
Вывод:
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 69 | C++98 | непрерывность памяти для элементов vector'а не требуется
|
требуется |
| LWG 230 | C++98 | T не обязательно должен быть CopyConstructible (элементтипа T может быть не создан)
|
T также должен быть CopyConstructible
|
| LWG 464 | C++98 | доступ к базовому хранилищу пустого vector приводит к UB(Неопределенное Поведение) |
предоставлена функция data
|