std::map
Определено в заголовочном файле <map> | ||
template< class Key, | (1) | |
namespace pmr { template< | (2) | (начиная с C++17) |
std::map
это сортируемый ассоциативный контейнер, который содержит пары ключ-значение с уникальными ключами. Ключи сортируются с помощью функции сравнения Compare
. Операции поиска, удаления и вставки имеют логарифмическую сложность. Карты обычно реализуются как красно-чёрные деревья.
Везде, где стандартная библиотека использует требования Compare, уникальность определяется с помощью отношения эквивалентности. Грубо говоря, два объекта a
и b
считаются эквивалентными (не уникальными), если ни один из них при сравнении не меньше, чем другой: !comp(a, b)&&!comp(b, a).
std::map
соответствует требованиям Container
, AllocatorAwareContainer
, AssociativeContainer
и ReversibleContainer
.
Содержание |
[править]Параметры шаблона
Этот раздел не завершён Причина: Добавить описания параметров шаблона. |
[править]Типы элементы
Тип элемент | Определение | ||||
key_type | Key | ||||
mapped_type | T | ||||
value_type | std::pair<const Key, T> | ||||
size_type | Беззнаковый целочисленный тип (обычно std::size_t) | ||||
difference_type | Знаковый целочисленный тип (обычно std::ptrdiff_t) | ||||
key_compare | Compare | ||||
allocator_type | Allocator | ||||
reference | value_type& | ||||
const_reference | const value_type& | ||||
pointer |
| ||||
const_pointer |
| ||||
iterator | LegacyBidirectionalIterator в value_type | ||||
const_iterator | LegacyBidirectionalIterator в const value_type | ||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> | ||||
node_type (начиная с C++17) | специализация дескриптора узла, представляющая узел контейнера | ||||
insert_return_type (начиная с C++17) | тип, описывающий результат вставки node_type , специализацияtemplate<class Iter, class NodeType>struct/*неопределена*/{ |
[править]Классы элементы
сравнивает объекты типа value_type (класс) |
[править]Функции элементы
создаёт map (public функция-элемент) | |
уничтожает map (public функция-элемент) | |
присваивает значения контейнеру (public функция-элемент) | |
возвращает связанный аллокатор (public функция-элемент) | |
Доступ к элементам | |
предоставляет доступ к указанному элементу с проверкой границ (public функция-элемент) | |
предоставляет доступ к или вставляет указанному элементу (public функция-элемент) | |
Итераторы | |
(C++11) | возвращает итератор на начало (public функция-элемент) |
(C++11) | возвращает итератор на конец (public функция-элемент) |
(C++11) | возвращает обратный итератор на начало (public функция-элемент) |
(C++11) | возвращает обратный итератор на конец (public функция-элемент) |
Ёмкость | |
проверяет, пуст ли контейнер (public функция-элемент) | |
возвращает количество элементов (public функция-элемент) | |
возвращает максимально возможное количество элементов (public функция-элемент) | |
Модификаторы | |
очищает содержимое (public функция-элемент) | |
вставляет элементы или узлы(начиная с C++17) (public функция-элемент) | |
(C++23) | вставляет ряд элементов (public функция-элемент) |
(C++17) | вставляет элемент или присваивает текущему элементу, если ключ уже существует (public функция-элемент) |
(C++11) | создаёт элемент на месте (public функция-элемент) |
(C++11) | создаёт элементы на месте, используя подсказку (public функция-элемент) |
(C++17) | вставляет "на месте", если ключ не существует, ничего не делает, если ключ существует (public функция-элемент) |
удаляет элементы (public функция-элемент) | |
обменивает содержимое (public функция-элемент) | |
(C++17) | извлекает узлы из контейнера (public функция-элемент) |
(C++17) | сливает с узлами из другого контейнера (public функция-элемент) |
Просмотр | |
возвращает количество элементов, соответствующих определённому ключу (public функция-элемент) | |
ищет элемент с определённым ключом (public функция-элемент) | |
(C++20) | проверяет, содержит ли контейнер элемент с определённым ключом (public функция-элемент) |
возвращает диапазон элементов, соответствующих определённому ключу (public функция-элемент) | |
возвращает итератор на первый элемент не меньший, чем заданный ключ (public функция-элемент) | |
возвращает итератор на первый элемент больший, чем заданный ключ (public функция-элемент) | |
Наблюдатели | |
возвращает функцию, сравнивающую ключи (public функция-элемент) | |
возвращает функцию, которая сравнивает ключи в объектах типа value_type (public функция-элемент) |
[править]Функции, не являющиеся элементами
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) | лексикографически сравнивает значения в map (шаблон функции) |
специализация алгоритма std::swap (шаблон функции) | |
(C++20) | стирает все элементы, соответствующие определённым критериям (шаблон функции) |
Принципы вывода | (начиная с C++17) |
[править]Примечание
Макрос тест функциональности | Значение | Стандарт | Комментарий |
---|---|---|---|
__cpp_lib_containers_ranges | 202202L | (C++23) | Создание и вставка диапазонов для контейнеров |
[править]Пример
#include <iostream>#include <map>#include <string>#include <string_view> void print_map(std::string_view comment, const std::map<std::string, int>& m){std::cout<< comment;// итерация с использованием средств C++17for(constauto&[key, value]: m){std::cout<<'['<< key <<"] = "<< value <<"; ";}// альтернатива C++11:// for (const auto& n : m) {// std::cout << '[' << n.first << "] = " << n.second << "; ";// }// альтернатива C++98:// for (std::map<std::string, int>::const_iterator it = m.begin(); it != m.end(); it++) {// std::cout << '[' << it->first << "] = " << it->second << "; ";// }std::cout<<"\n";} int main(){// Создаём карту из трёх строк (которые отображаются на целые числа) std::map<std::string, int> m {{"CPU", 10}, {"GPU", 15}, {"RAM", 20}, }; print_map("1) Начальная карта: ", m); m["CPU"]=25;// модифицируем существующее значение m["SSD"]=30;// вставляем новое значение print_map("2) Модифицированная карта: ", m); // использование operator[] с несуществующим ключом всегда выполняет вставкуstd::cout<<"3) m[UPS] = "<< m["UPS"]<<'\n'; print_map("4) Модифицированная карта: ", m); m.erase("GPU"); print_map("5) После стирания: ", m); std::erase_if(m, [](constauto& pair){return pair.second>25;}); print_map("6) После стирания: ", m);std::cout<<"7) m.size() = "<< m.size()<<'\n'; m.clear();std::cout<<std::boolalpha<<"8) Карта пуста: "<< m.empty()<<'\n';}
Вывод:
1) Начальная карта: [CPU] = 10; [GPU] = 15; [RAM] = 20; 2) Модифицированная карта: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; 3) m[UPS] = 0 4) Модифицированная карта: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; [UPS] = 0; 5) После стирания: [CPU] = 25; [RAM] = 20; [SSD] = 30; [UPS] = 0; 6) После стирания: [CPU] = 25; [RAM] = 20; [UPS] = 0; 7) m.size() = 3 8) Карта пуста: true
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 464 | C++98 | доступ к const map по ключу был неудобным | предоставлена функция at |