std::vector
Определён в заголовочном файле <vector> | ||
|---|---|---|
template<
class T,
class Allocator = std::allocator<T>
> class vector;
| (1) | |
namespace pmr {
template< class T >
using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;
}
| (2) | (начиная с C++17) |
std::vector — это контейнер последовательностей, инкапсулирующий массивы динамического размера.Элементы хранятся непрерывно, а значит, к ним можно обращаться не только через итераторы, но и с помощью смещений относительно обычных указателей на элементы. Это означает, что указатель на элемент вектора можно передать любой функции, ожидающей указатель на элемент массива.
Хранилище вектора управляется автоматически и расширяется по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, поскольку для обработки будущего роста выделяется дополнительная память. Благодаря этому вектору не нужно перераспределять память при каждой вставке элемента — это происходит только тогда, когда дополнительная память исчерпана. Объём выделенной памяти можно получить с помощью функции capacity(). Освободить неиспользуемую память можно, вызвав shrink_to_fit()[1].
Перераспределение памяти обычно требует значительных затрат производительности. Функцию reserve() можно использовать, чтобы избежать перераспределения, если число элементов известно заранее.
Сложность (эффективность) распространённых операций над векторами:
- Произвольный доступ — константная 𝓞(1).
- Вставка или удаление элементов в конце — амортизированная константная 𝓞(1).
- Вставка или удаление элементов — линейная относительно расстояния до конца вектора 𝓞(n).
std::vector (для T, отличных от bool) соответствует требованиям контейнера, контейнера с поддержкой распределителя памяти(начиная с C++11), контейнера последовательностей, непрерывного контейнера(начиная с C++17) и обратимого контейнера.
| Все функции-члены Однако объявление переменной constexpr типа | (начиная с C++20) |
- В libstdc++
shrink_to_fit()недоступен в режиме C++98.
Параметры шаблона
| T | - | Тип элементов.
|
||||||
| 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 | constvalue_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) | добавляет диапазон элементов в конец (открытая функция-член) |
| удаляет последний элемент (открытая функция-член) |
|
| изменяет число хранящихся элементов (открытая функция-член) |
|
| обменивает содержимое (открытая функция-член) |
|
Функции, не являющиеся членами
|
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20) | лексикографически сравнивает значения двух vector (шаблон функции) |
специализирует алгоритм std::swap (шаблон функции) |
|
|
(C++20) | удаляет все элементы, удовлетворяющие заданным критериям (шаблон функции) |
Руководства по выводу типов | (начиная с C++17) |
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_incomplete_container_elements | 201505L | (C++17) | Минимальная поддержка неполных типов |
__cpp_lib_containers_ranges | 202202L | (C++23) | Создание контейнеров из диапазонов и вставка диапазонов в контейнеры |
Пример
#include <iostream>
#include <vector>
int main()
{
// Create a vector containing integers
std::vector<int> v = {8, 4, 5, 9};
// Add two more integers to vector
v.push_back(6);
v.push_back(9);
// Overwrite element at position 2
v[2] = -1;
// Print out the vector
for (int n : v)
std::cout << n << ' ';
std::cout << '\n';
}
Вывод:
8 4 -1 9 6 9
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 69 | C++98 | не требовалось непрерывное хранение элементов vector | требуется |
| LWG 230 | C++98 |
T не обязан был быть конструируемым копированием(элемент типа T мог оказаться неконструируемым) |
Теперь T также долженбыть конструируемым копированием |
| LWG 464 | C++98 | доступ к базовому хранилищу пустого vector приводил к неопределённому поведению |
предоставлена функция data |
См. также
|
(C++26) | изменяемый размер, фиксированная ёмкость, непрерывный массив с хранением внутри объекта (шаблон класса) |
|
(C++11) | массив фиксированного размера с непрерывным хранением внутри объекта (шаблон класса) |
| двусторонняя очередь (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/vector