Пространства имён
Варианты
Действия

vector

Материал из cppreference.com
< cpp‎ | container
 
 
 
 
Определено в заголовочном файле <vector>
template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template < class T>
    using vector = std::vector<T, std::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) соответствует требованиям Container, AllocatorAwareContainer, SequenceContainer , ContiguousContainer (начиная с C++17) и ReversibleContainer.

Функции-элементы 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, но многие функции-элементы предъявляют более строгие требования. Этот контейнер (но не его элементы) может быть создан с неполным типом элемента, если аллокатор соответствует требованиям к завершённости аллокатора.

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_incomplete_container_elements 201505L (C++17) Минимальная неполная поддержка типов
(начиная с C++17)

[править]

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
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

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
(public функция-элемент) [править]
уничтожает vector
(public функция-элемент) [править]
присваивает значения контейнеру
(public функция-элемент) [править]
присваивает значения контейнеру
(public функция-элемент) [править]
присваивает диапазон значений контейнеру
(public функция-элемент) [править]
возвращает связанный аллокатор
(public функция-элемент) [править]
Доступ к элементам
предоставляет доступ к указанному элементу с проверкой границ
(public функция-элемент) [править]
предоставляет доступ к указанному элементу
(public функция-элемент) [править]
предоставляет доступ к первому элементу
(public функция-элемент) [править]
предоставляет доступ к последнему элементу
(public функция-элемент) [править]
прямой доступ к базовому массиву
(public функция-элемент) [править]
Итераторы
возвращает итератор на начало
(public функция-элемент) [править]
(C++11)
возвращает итератор на конец
(public функция-элемент) [править]
возвращает обратный итератор на начало
(public функция-элемент) [править]
возвращает обратный итератор на конец
(public функция-элемент) [править]
Ёмкость
проверяет, пуст ли контейнер
(public функция-элемент) [править]
возвращает количество элементов
(public функция-элемент) [править]
возвращает максимально возможное количество элементов
(public функция-элемент) [править]
резервирует память
(public функция-элемент) [править]
возвращает количество элементов, которые могут храниться в выделенной в данный момент памяти
(public функция-элемент) [править]
уменьшает использование памяти за счёт освобождения неиспользуемой памяти
(public функция-элемент) [править]
Модификаторы
очищает содержимое
(public функция-элемент) [править]
вставляет элементы
(public функция-элемент) [править]
вставляет ряд элементов
(public функция-элемент) [править]
(C++11)
создаёт элемент на месте
(public функция-элемент) [править]
удаляет элементы
(public функция-элемент) [править]
добавляет элемент в конец
(public функция-элемент) [править]
создаёт элементы на месте в конце
(public функция-элемент) [править]
добавляет диапазон элементов в конец
(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