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 можно создавать и использовать при вычислении константного выражения.

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

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

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

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

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

(начиная с C++17)
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 constvalue_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 для constvalue_type

(до C++20)

LegacyRandomAccessIterator, contiguous_iterator и ConstexprIterator для constvalue_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)
лексикографически сравнивает значения двух vector
(шаблон функции)
std::swap(std::vector)
специализирует алгоритм std::swap
(шаблон функции)
erase(std::vector)erase_if(std::vector)
(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

См. также

inplace_vector
(C++26)
изменяемый размер, фиксированная ёмкость, непрерывный массив с хранением внутри объекта
(шаблон класса)
array
(C++11)
массив фиксированного размера с непрерывным хранением внутри объекта
(шаблон класса)
deque
двусторонняя очередь
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/vector

Spec-Zone.ru

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