Spec-Zone.ru › C++

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

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

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

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

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

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

Контейнеры последовательности

Контейнеры последовательности реализуют структуры данных, к которым можно получить последовательный доступ.

array
(C++11)
статический непрерывный массив
(шаблон класса)
vector
динамический непрерывный массив
(шаблон класса)
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)
адаптирует два контейнера для обеспечения набора пар ключ-значение, отсортированный по ключам
(шаблон класса)

Виды

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

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[] также учитывается, так как он может вставить элемент в карту.
(с C++11)
  • Примерами методов удаления являются std::set::erase, std::vector::pop_back, std::deque::pop_front, и std::map::clear.
    • clear делает недействительными все итераторы и ссылки. Поскольку он удаляет все элементы, это технически соответствует вышеуказанным правилам.

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

Итератор до конца заслуживает особого упоминания. В общем случае этот итератор становится недействительным так, как будто он был обычным итератором на неудалённый элемент. Итак, std::set::end никогда не становится недействительным, std::unordered_set::end становится недействительным только при перехешировании(с C++11), 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. Операции с итераторами (например, инкрементирование итератора) считывают, но не изменяют базовый контейнер, и могут выполняться одновременно с операциями с другими итераторами на том же контейнере, с константными членами-функциями или чтением из элементов. Операции контейнера, которые делают недействительными любые итераторы, изменяют контейнер и не могут выполняться одновременно ни с какими операциями с существующими итераторами, даже если эти итераторы не становятся недействительными.
  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
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
get_allocator
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> Заголовок
Псевдоконтейнер Последовательные контейнеры Ассоциативные контейнеры Неупорядоченные ассоциативные контейнеры Адаптеры контейнеров

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

(с 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/w/cpp/container

Spec-Zone.ru

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