Spec-Zone.ru › C++

Библиотека контейнеров

Библиотека контейнеров — это универсальный набор шаблонов классов и алгоритмов, позволяющих программистам легко реализовывать распространённые структуры данных, такие как очереди, списки и стеки. Существует два(до C++11)три(начиная с C++11) класса контейнеров:

  • последовательные контейнеры,
  • ассоциативные контейнеры,
  • неупорядоченные ассоциативные контейнеры,
(начиная с C++11)

каждый из которых предназначен для поддержки своего набора операций.

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

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

Последовательные контейнеры

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

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

Ассоциативные контейнеры

Ассоциативные контейнеры реализуют отсортированные структуры данных, поиск в которых выполняется быстро (сложность O(log n)).

set
коллекция уникальных ключей, отсортированных по ключам
(шаблон класса)
map
коллекция пар «ключ — значение», отсортированных по ключам; ключи уникальны
(шаблон класса)
multiset
коллекция ключей, отсортированных по ключам
(шаблон класса)
multimap
коллекция пар «ключ — значение», отсортированных по ключам
(шаблон класса)

Неупорядоченные ассоциативные контейнеры (начиная с C++11)

Неупорядоченные ассоциативные контейнеры реализуют неотсортированные (хешированные) структуры данных, поиск в которых выполняется быстро (средняя сложность O(1), в худшем случае — O(n)).

unordered_set
(C++11)
коллекция уникальных ключей, хешируемых по ключам
(шаблон класса)
unordered_map
(C++11)
коллекция пар «ключ — значение», хешируемых по ключам; ключи уникальны
(шаблон класса)
unordered_multiset
(C++11)
коллекция ключей, хешируемых по ключам
(шаблон класса)
unordered_multimap
(C++11)
коллекция пар «ключ — значение», хешируемых по ключам
(шаблон класса)

Адаптеры контейнеров

Адаптеры контейнеров предоставляют другой интерфейс для последовательных контейнеров.

stack
адаптирует контейнер для реализации стека (структуры данных LIFO)
(шаблон класса)
queue
адаптирует контейнер для реализации очереди (структуры данных FIFO)
(шаблон класса)
priority_queue
адаптирует контейнер для реализации очереди с приоритетом
(шаблон класса)
flat_set
(C++23)
адаптирует контейнер для представления коллекции уникальных ключей, отсортированных по ключам
(шаблон класса)
flat_map
(C++23)
адаптирует два контейнера для представления коллекции пар «ключ — значение», отсортированных по уникальным ключам
(шаблон класса)
flat_multiset
(C++23)
адаптирует контейнер для представления коллекции ключей, отсортированных по ключам
(шаблон класса)
flat_multimap
(C++23)
адаптирует два контейнера для представления коллекции пар «ключ — значение», отсортированных по ключам
(шаблон класса)

Представления (начиная с C++20)

Представления предоставляют гибкие средства для работы с одномерными и многомерными представлениями невладеющего массива элементов.

span
(C++20)
невладеющее представление непрерывной последовательности объектов
(шаблон класса)
mdspan
(C++23)
невладеющее представление многомерного массива
(шаблон класса)

Инвалидация итераторов

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

Категория Контейнер После вставки остаются ли... После удаления остаются ли... Условие
итераторы действительными? ссылки действительными? итераторы действительными? ссылки действительными?
Последовательные контейнеры array Н/Д Н/Д
vector Нет Н/Д Вставка изменила ёмкость
Да Да Перед изменённым элементом (элементами)
(для вставки — только если ёмкость не изменилась)
Нет Нет На позиции изменённого элемента (элементов) или после неё
deque Нет Да Да, за исключением удалённого элемента (элементов) Изменён первый или последний элемент
Нет Нет Изменена только середина
list Да Да, за исключением удалённого элемента (элементов)
forward_list Да Да, за исключением удалённого элемента (элементов)
Ассоциативные контейнеры set
multiset
map
multimap
Да Да, за исключением удалённого элемента (элементов)
Неупорядоченные ассоциативные контейнеры unordered_set
unordered_multiset
unordered_map
unordered_multimap
Нет Да Н/Д Вставка вызвала рехеширование
Да Да, за исключением удалённого элемента (элементов) Рехеширования не произошло

Здесь под вставкой понимается любой метод, добавляющий в контейнер один или несколько элементов, а под удалением — любой метод, удаляющий из контейнера один или несколько элементов.

  • К методам вставки относятся std::set::insert, std::map::emplace, std::vector::push_back и std::deque::push_front.
  • Обратите внимание, что std::unordered_map::operator[] также считается вставкой, поскольку может добавить элемент в map.
(начиная с C++11)
  • К методам удаления относятся std::set::erase, std::vector::pop_back, std::deque::pop_front и std::map::clear.
    • clear инвалидирует все итераторы и ссылки. Поскольку он удаляет все элементы, формально это соответствует приведённым выше правилам.

Если не указано иное (явно или через определение функции в терминах других функций), передача контейнера в качестве аргумента функции библиотеки никогда не инвалидирует итераторы на объекты внутри контейнера и не изменяет значения этих объектов.

Особого упоминания заслуживает итератор за последним элементом. В общем случае этот итератор инвалидируется так же, как обычный итератор на не удалённый элемент. Поэтому std::set::end никогда не инвалидируется, std::unordered_set::end инвалидируется только при рехешировании, std::vector::end всегда инвалидируется (поскольку он всегда находится после изменённых элементов) и так далее.

Есть одно исключение: удаление, при котором удаляется последний элемент std::deque, инвалидирует итератор за последним элементом, хотя он не указывает на удалённый элемент контейнера (и вообще не указывает на элемент). В сочетании с общими правилами для итераторов std::deque итог таков: единственная изменяющая операция, которая не инвалидирует std::deque::end, — это удаление первого элемента, если он не является последним.

Безопасность при работе с потоками

  1. Все функции контейнеров можно одновременно вызывать из разных потоков для разных контейнеров. В более общем случае функции стандартной библиотеки C++ не читают объекты, доступные из других потоков, если эти объекты не доступны прямо или косвенно через аргументы функции, включая указатель this.
  2. Все функции-члены const можно одновременно вызывать из разных потоков для одного и того же контейнера. Кроме того, функции-члены begin(), end(), rbegin(), rend(), front(), back(), data(), find(), lower_bound(), upper_bound(), equal_range(), at() и, за исключением ассоциативных контейнеров, operator[], для целей обеспечения безопасности при работе с потоками ведут себя как const (то есть их также можно одновременно вызывать из разных потоков для одного и того же контейнера). В более общем случае функции стандартной библиотеки C++ не изменяют объекты, если эти объекты не доступны прямо или косвенно через неконстантные аргументы функции, включая указатель this.
  3. Разные элементы одного контейнера можно изменять одновременно из разных потоков, за исключением элементов std::vector<bool> (например, вектор объектов std::future может получать значения из нескольких потоков).
  4. Операции с итераторами (например, увеличение итератора) читают базовый контейнер, но не изменяют его; их можно выполнять одновременно с операциями над другими итераторами того же контейнера, с функциями-членами const или с чтением элементов. Операции с контейнером, инвалидирующие любые итераторы, изменяют контейнер, поэтому их нельзя выполнять одновременно с операциями над существующими итераторами, даже если эти итераторы не инвалидируются.
  5. Элементы одного контейнера можно изменять одновременно с функциями-членами, для которых не указано обращение к этим элементам. В более общем случае функции стандартной библиотеки C++ не читают объекты, доступные косвенно через свои аргументы (включая другие элементы контейнера), если этого не требует их спецификация.
  6. В любом случае операции с контейнерами (а также алгоритмы и любые другие функции стандартной библиотеки C++) могут распараллеливаться внутри реализации, если это не меняет видимые пользователю результаты (например, std::transform может выполняться параллельно, а std::for_each — нет, поскольку по спецификации он должен посещать каждый элемент последовательности по порядку).
(начиная с C++11)

Таблица функций

Примечание: стандарт не считает std::basic_string контейнером, но из-за его сходства он ведёт себя почти так же. Для удобства здесь он указан как «псевдоконтейнер».

- функции, присутствующие в C++03
- функции, присутствующие начиная с C++11
- функции, присутствующие начиная с C++17
- функции, присутствующие начиная с C++20
- функции, присутствующие начиная с C++23

Таблица функций-членов

Псевдоконтейнер Последовательностные контейнеры Ассоциативные контейнеры Неупорядоченные ассоциативные контейнеры Адаптеры контейнеров
Заголовок <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> Заголовок
Контейнер
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Контейнер
(constructor)
basic_string
(неявно)
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
(constructor)
(destructor)
~basic_string
(неявно)
~vector
~deque
~forward_list
~list
~set
~multiset
~map
~multimap
~unordered_set
~unordered_multiset
~unordered_map
~unordered_multimap
~stack
~queue
~priority_queue
~flat_set
~flat_multiset
~flat_map
~flat_multimap
(destructor)
operator=
operator=
(неявно)
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
operator=
assign
assign
assign
assign
assign
assign
assign
assign_range
assign_range
assign_range
assign_range
assign_range
assign_range
assign_range
Итераторы
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
begin
cbegin
Итераторы
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
end
cend
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rbegin
crbegin
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
rend
crend
Доступ
к элементам
at
at
at
at
at
at
at
at
at
Доступ
к элементам
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
operator[]
data
data
data
data
data
front
front
front
front
front
front
front
front
top
front
back
back
back
back
back
back
top
back
back
Вместимость
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
empty
Вместимость
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
max_size
resize
resize
resize
resize
resize
resize
resize
capacity
capacity
capacity
capacity
reserve
reserve
reserve
reserve
reserve
reserve
reserve
reserve
shrink_to_fit
shrink_to_fit
shrink_to_fit
shrink_to_fit
shrink_to_fit
Модификаторы
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
clear
Модификаторы
insert
insert
insert
insert
insert_after
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert_range
insert_range
insert_range
insert_range
insert_range_after
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_range
insert_or_assign
insert_or_assign
insert_or_assign
insert_or_assign
insert_or_assign
emplace
emplace
emplace
emplace_after
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
emplace_hint
try_emplace
try_emplace
try_emplace
try_emplace
try_emplace
erase
erase
erase
erase
erase_after
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
erase
push_front
push_front
push_front
push_front
push_front
prepend_range
prepend_range
prepend_range
prepend_range
prepend_range
emplace_front
emplace_front
emplace_front
emplace_front
emplace_front
pop_front
pop_front
pop_front
pop_front
pop
pop
pop_front
push_back
push_back
push_back
push_back
push_back
push
push
push
push_back
append_range
append_range
append_range
append_range
append_range
push_range
push_range
push_range
append_range
emplace_back
emplace_back
emplace_back
emplace_back
emplace
emplace
emplace
emplace_back
pop_back
pop_back
pop_back
pop_back
pop_back
pop
pop_back
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
merge
extract [1]
extract
extract
extract
extract
extract
extract
extract
extract
extract
Операции со списками
splice
splice_after
splice
splice
Операции со списками
remove
remove
remove
remove
remove_if
remove_if
remove_if
remove_if
reverse
reverse
reverse
reverse
unique
unique
unique
unique
sort
sort
sort
sort
Корзины и хеширование
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
begin(size_type)
cbegin(size_type)
Корзины и хеширование
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
end(size_type)
cend(size_type)
bucket_count
bucket_count
bucket_count
bucket_count
bucket_count
bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
max_bucket_count
bucket_size
bucket_size
bucket_size
bucket_size
bucket_size
bucket_size
bucket
bucket
bucket
bucket
bucket
bucket
load_factor
load_factor
load_factor
load_factor
load_factor
load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
max_load_factor
rehash
rehash
rehash
rehash
rehash
rehash
Поиск
count
count
count
count
count
count
count
count
count
count
count
count
count
count
Поиск
find
find
find
find
find
find
find
find
find
find
find
find
find
find
find
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
contains
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
lower_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
upper_bound
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
equal_range
Наблюдатели
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
key_comp
Наблюдатели
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
value_comp
hash_function
hash_function
hash_function
hash_function
hash_function
hash_function
key_eq
key_eq
key_eq
key_eq
key_eq
key_eq
Аллокатор
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
get_allocator
Аллокатор
Адаптеры
extract [2]
extract
extract
extract
extract
extract
Адаптеры
replace
replace
replace
replace
replace
replace
Контейнер
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Контейнер
Заголовок <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> Заголовок
Псевдоконтейнер Последовательные контейнеры Ассоциативные контейнеры Неупорядоченные ассоциативные контейнеры Адаптеры контейнеров
  • Примечание: функции в двух разных строках extract имеют разное значение и синтаксис:
  1. например, node_type extract(const_iterator) или node_type extract(Key&)
  2. например, container_type extract() &&

Таблица нестатических функций

Псевдоконтейнер Контейнеры последовательностей Ассоциативные контейнеры Неупорядоченные ассоциативные контейнеры Адаптеры контейнеров
Заголовок <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> Заголовок
Контейнер
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Контейнер
Свободная функция
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
operator==
Свободная функция
operator!= (removed in C++20)
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!=
operator!= (removed in C++20)
operator< (removed in C++20)
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator<
operator< (removed in C++20)
operator<= (removed in C++20)
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<=
operator<= (removed in C++20)
operator> (removed in C++20)
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator>
operator> (removed in C++20)
operator>= (removed in C++20)
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>=
operator>= (removed in C++20)
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
operator<=>
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
swap
erase
erase
erase
erase
erase
erase
erase
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
erase_if
Контейнер
basic_string
array
vector
deque
forward_list
list
set
multiset
map
multimap
unordered_set
unordered_multiset
unordered_map
unordered_multimap
stack
queue
priority_queue
flat_set
flat_multiset
flat_map
flat_multimap
Контейнер
Заголовочный файл <string> <array> <vector> <deque> <forward_list> <list> <set> <map> <unordered_set> <unordered_map> <stack> <queue> <flat_set> <flat_map> Заголовочный файл
Псевдоконтейнер Контейнеры последовательностей Ассоциативные контейнеры Неупорядоченные ассоциативные контейнеры Адаптеры контейнеров

Операторы <, <=, >, >= и != синтезируются из operator<=> и operator== соответственно.

(начиная с C++20)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применено к Опубликованное поведение Правильное поведение
LWG 51 C++98 Итераторы контейнера могли становиться недействительными
в результате любой операции библиотеки
они становятся недействительными только
в случаях, оговорённых спецификацией

См. также

Именованные требования C++:

  • Контейнер
  • Контейнер последовательности
  • Непрерывный контейнер
  • Обратимый контейнер
  • Ассоциативный контейнер
  • Контейнер с поддержкой аллокатора
  • Неупорядоченный ассоциативный контейнер
valarray
числовые массивы, маски массивов и срезы массивов
(шаблон класса)
basic_string
хранит и обрабатывает последовательности символов
(шаблон класса)
basic_string_view
(C++17)
представление строки только для чтения
(шаблон класса)

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

Spec-Zone.ru

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