Spec-Zone.ru › C++

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)
1) std::vector — это контейнер последовательности, который инкапсулирует динамические массивы.
2) std::pmr::vector — это шаблон-псевдоним, который использует полиморфный аллокатор.

Элементы хранятся непрерывно, что означает, что к элементам можно получить доступ не только через итераторы, но также используя смещения к обычным указателям на элементы. Это означает, что указатель на элемент вектора может быть передан любой функции, которая ожидает указатель на элемент массива.

Хранение вектора обрабатывается автоматически, расширяясь по мере необходимости. Векторы обычно занимают больше места, чем статические массивы, поскольку выделяется больше памяти для обработки будущего роста. Таким образом, вектору не нужно перевыделять память каждый раз при вставке элемента, а только при исчерпании дополнительной памяти. Общий объем выделенной памяти можно запросить, используя функцию capacity(). Дополнительная память может быть возвращена системе с помощью вызова shrink_to_fit()[1].

Перевыделения памяти обычно являются дорогостоящими операциями с точки зрения производительности. Функция reserve() может быть использована для устранения перевыделений, если количество элементов известно заранее.

Сложность (эффективность) распространённых операций с векторами выглядит следующим образом:

  • Случайный доступ — постоянная 𝓞(1).
  • Вставка или удаление элементов в конце — амортизированная постоянная 𝓞(1).
  • Вставка или удаление элементов — линейная относительно расстояния до конца вектора 𝓞(n).

std::vector (для T отличных от bool) удовлетворяет требованиям Контейнера, Контейнера с поддержкой аллокаторов(с C++11), Последовательного контейнера, Непрерывного контейнера(с C++17) и Обратимого контейнера.

Член-функции std::vector являются constexpr: возможно создание и использование объектов std::vector в вычислении константного выражения.

Однако, объекты std::vector обычно не могут быть constexpr, так как любая динамически выделенная память должна быть освобождена в рамках того же вычисления константного выражения.

(с C++20)
  1. В libstdc++, shrink_to_fit() не доступен в режиме C++98.

Параметры шаблона

T - Тип элементов.
T должен удовлетворять требованиям CopyAssignable и CopyConstructible. (до C++11)
Требования к элементам зависят от выполняемых операций с контейнером. Обычно требуется, чтобы тип элемента был полным типом и удовлетворял требованиям Erasable, но многие член-функции предъявляют более строгие требования. (с C++11)
(до C++17)

Требования к элементам зависят от выполняемых операций с контейнером. Обычно требуется, чтобы тип элемента удовлетворял требованиям Erasable, но многие член-функции предъявляют более строгие требования. Этот контейнер (но не его члены) может быть создан с неполным типом элемента, если аллокатор удовлетворяет требованиям полноты аллокатора.

Макрос проверки возможностей Значение Std Функция
__cpp_lib_incomplete_container_elements 201505L (C++17) Минимальная поддержка неполных типов
(с C++17)
Allocator - Аллокатор, используемый для выделения/освобождения памяти и для создания/удаления элементов в этой памяти. Тип должен соответствовать требованиям Allocator. Поведение неопределено(до C++20)Программа неверна(с C++20) если Allocator::value_type не совпадает с T.

Специализации

Библиотека стандартных шаблонов предоставляет специализацию std::vector для типа bool, которая может быть оптимизирована для экономии места.

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
Allocator::pointer (до C++11)
std::allocator_traits<Allocator>::pointer (с C++11)
const_pointer
Allocator::const_pointer (до C++11)
std::allocator_traits<Allocator>::const_pointer (с C++11)
iterator

LegacyRandomAccessIterator и LegacyContiguousIterator для value_type

(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для value_type

(с C++20)
const_iterator

LegacyRandomAccessIterator и LegacyContiguousIterator для const value_type

(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для const value_type

(с C++20)
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

Функции-члены

(конструктор)
создаёт vector
(публичный член-функция)
(деструктор)
уничтожает vector
(публичный член-функция)
operator=
присваивает значения контейнеру
(публичный член-функция)
assign
присваивает значения контейнеру
(публичный член-функция)
assign_range
(C++23)
присваивает диапазон значений контейнеру
(публичный член-функция)
get_allocator
возвращает связанный аллокатор
(публичный член-функция)
Доступ к элементам
at
доступ к указанному элементу с проверкой границ
(публичный член-функция)
operator[]
доступ к указанному элементу
(публичный член-функция)
front
доступ к первому элементу
(публичный член-функция)
back
доступ к последнему элементу
(публичный член-функция)
data
прямой доступ к хранилищу непрерывных данных
(публичный член-функция)
Итераторы
begincbegin
(C++11)
возвращает итератор к началу
(публичный член-функция)
endcend
(C++11)
возвращает итератор к концу
(публичный член-функция)
rbegincrbegin
(C++11)
возвращает обратный итератор к началу
(публичный член-функция)
rendcrend
(C++11)
возвращает обратный итератор к концу
(публичный член-функция)
Ёмкость
empty
проверяет, пуст ли контейнер
(публичный член-функция)
size
возвращает количество элементов
(публичный член-функция)
max_size
возвращает максимальное возможное количество элементов
(публичный член-функция)
reserve
резервирует память
(публичный член-функция)
capacity
возвращает количество элементов, которые могут быть сохранены в текущем выделенном хранилище
(публичный член-функция)
shrink_to_fit
(DR*)
уменьшает использование памяти, освобождая неиспользуемую память
(публичный член-функция)
Модификаторы
clear
очищает содержимое
(публичный член-функция)
insert
вставляет элементы
(публичный член-функция)
insert_range
(C++23)
вставляет диапазон элементов
(публичный член-функция)
emplace
(C++11)
создаёт элемент на месте
(публичный член-функция)
erase
удаляет элементы
(публичный член-функция)
push_back
добавляет элемент в конец
(публичный член-функция)
emplace_back
(C++11)
создаёт элемент на месте в конце
(публичный член-функция)
append_range
(C++23)
добавляет диапазон элементов в конец
(публичный член-функция)
pop_back
удаляет последний элемент
(публичный член-функция)
resize
изменяет количество хранимых элементов
(публичный член-функция)
swap
меняет содержимое
(публичный член-функция)

Независимые функции

operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20)
лексикографически сравнивает значения двух vectors
(шаблон функции)
std::swap(std::vector)
специализирует алгоритм std::swap
(шаблон функции)
erase(std::vector)erase_if(std::vector)
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API