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) и Обратимого контейнера.
| Член-функции Однако, объекты | (с 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) | добавляет диапазон элементов в конец (публичный член-функция) |
| удаляет последний элемент (публичный член-функция) |
|
| изменяет количество хранимых элементов (публичный член-функция) |
|
| меняет содержимое (публичный член-функция) |
|
Независимые функции
|
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) | лексикографически сравнивает значения двух vectors (шаблон функции) |
специализирует алгоритм std::swap (шаблон функции) |
|
|
(C++20) | удаляет все элементы, удовлетворяющие определённым критериям (шаблон функции) |
Руководства по выводу | (с 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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/vector