std::vector
Определено в заголовочном файле <vector>
|
||
template< class T, |
(1) | |
namespace pmr { template < class T> |
(2) | (начиная с C++17) |
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 функция-элемент) |
[править] Функции, не являющиеся элементами
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) |
лексикографически сравнивает значения в vector (шаблон функции) |
специализация алгоритма std::swap (шаблон функции) | |
удаляет все элементы, соответствующие определённым критериям (шаблон функции) |
Принципы вывода |
(начиная с C++17) |
[править] Примечание
Макрос тест функциональности | Значение | Стандарт | Комментарий |
---|---|---|---|
__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'; }
Вывод:
8 4 -1 9 6 9
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 69 | C++98 | непрерывность памяти для элементов vector 'а не требуется
|
требуется |
LWG 230 | C++98 | T не обязательно должен быть CopyConstructible (элементтипа T может быть не создан)
|
T также должен быть CopyConstructible
|
LWG 464 | C++98 | доступ к базовому хранилищу пустого vector приводит к UB(Неопределенное Поведение) |
предоставлена функция data
|