std:: map
|
Определено в заголовочном файле
<map>
|
||
|
template
<
class
Key,
|
(1) | |
|
namespace
pmr
{
template
<
|
(2) | (начиная с C++17) |
std::map
— это отсортированный ассоциативный контейнер, содержащий пары ключ-значение с уникальными ключами. Ключи сортируются с использованием функции сравнения
Compare
. Операции поиска, удаления и вставки имеют логарифмическую сложность. Карты обычно реализуются как
Красно-чёрные деревья
.
Итераторы
std::map
проходят элементы в порядке возрастания ключей, где возрастание определяется сравнением, использованным при создании. То есть, для заданных
-
m
,
std::map - it_l и it_r , разыменовываемые итераторы для m , причём it_l < it_r .
m. value_comp ( ) ( * it_l, * it_r ) == true (от наименьшего к наибольшему при использовании сравнения по умолчанию).
Везде, где стандартная библиотека использует требования Compare , уникальность определяется с использованием отношения эквивалентности. Говоря нестрого, два объекта a и b считаются эквивалентными (не уникальными), если ни один из них не меньше другого: ! comp ( a, b ) && ! comp ( b, a ) .
std::map
удовлетворяет требованиям
Container
,
AllocatorAwareContainer
,
AssociativeContainer
и
ReversibleContainer
.
Все функции-члены
std::map
являются
constexpr
: возможно создавать и использовать объекты
std::map
при вычислении константного выражения.
Однако, объекты
|
(since C++26) |
Содержание |
Параметры шаблона
|
Этот раздел не завершён
Причина: Добавьте описания параметров шаблона. |
Типы членов
| Тип | Определение | ||||
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
и
ConstexprIterator
(начиная с C++26)
для
value_type
|
||||
const_iterator
|
LegacyBidirectionalIterator и ConstexprIterator (начиная с C++26) для const value_type | ||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > | ||||
node_type
(начиная с C++17)
|
специализация node handle , представляющая узел контейнера | ||||
insert_return_type
(начиная с C++17)
|
тип, описывающий результат вставки
node_type
, специализация
template
<
class
Iter,
class
NodeType
>
|
Классы-члены
сравнивает объекты типа
value_type
(класс) |
Функции-члены
конструирует
map
(публичная функция-член) |
|
уничтожает
map
(публичная функция-член) |
|
|
присваивает значения контейнеру
(public member function) |
|
|
возвращает связанный аллокатор
(публичная функция-член) |
|
Доступ к элементам |
|
|
доступ к указанному элементу с проверкой границ
(публичная функция-член) |
|
|
доступ или вставка указанного элемента
(public member function) |
|
Итераторы |
|
|
(C++11)
|
возвращает итератор на начало
(публичная функция-член) |
|
(C++11)
|
возвращает итератор на конец
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на начало
(public member function) |
|
(C++11)
|
возвращает обратный итератор на конец
(публичная функция-член) |
Ёмкость |
|
|
проверяет, является ли контейнер пустым
(публичная функция-член) |
|
|
возвращает количество элементов
(публичная функция-член) |
|
|
возвращает максимально возможное количество элементов
(публичная функция-член) |
|
Модификаторы |
|
|
очищает содержимое
(публичная функция-член) |
|
|
вставляет элементы
или узлы
(since C++17)
(публичная функция-член) |
|
|
(C++23)
|
вставляет диапазон элементов
(публичная функция-член) |
|
(C++17)
|
вставляет элемент или присваивает значение текущему элементу, если ключ уже существует
(публичная функция-член) |
|
(C++11)
|
создаёт элемент на месте
(публичная функция-член) |
|
(C++11)
|
создаёт элементы на месте с использованием подсказки
(публичная функция-член) |
|
(C++17)
|
вставляет на месте, если ключ не существует, ничего не делает, если ключ существует
(публичная функция-член) |
|
удаляет элементы
(публичная функция-член) |
|
|
обменивает содержимое
(публичная функция-член) |
|
|
(C++17)
|
извлекает узлы из контейнера
(публичная функция-член) |
|
(C++17)
|
объединяет узлы из другого контейнера
(публичная функция-член) |
Поиск |
|
|
возвращает количество элементов, соответствующих определённому ключу
(public member function) |
|
|
находит элемент с заданным ключом
(публичная функция-член) |
|
|
(C++20)
|
проверяет, содержит ли контейнер элемент с указанным ключом
(публичная функция-член) |
|
возвращает диапазон элементов, соответствующих определённому ключу
(публичная функция-член) |
|
|
возвращает итератор на первый элемент
не меньший
чем заданный ключ
(публичная функция-член) |
|
|
возвращает итератор на первый элемент
больший
чем заданный ключ
(публичная функция-член) |
|
Наблюдатели |
|
|
возвращает функцию, которая сравнивает ключи
(публичная функция-член) |
|
возвращает функцию, которая сравнивает ключи в объектах типа
value_type
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
map
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++20)
|
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) |
Deduction guides |
(since C++17) |
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Конструирование и вставка диапазонов для контейнеров |
__cpp_lib_constexpr_map
|
202502L
|
(C++26) |
constexpr
std::map
|
Пример
#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++17 for (const auto& [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() { // Создание map из трех пар (string, int) std::map<std::string, int> m{{"CPU", 10}, {"GPU", 15}, {"RAM", 20}}; print_map("1) Исходный map: ", m); m["CPU"] = 25; // обновление существующего значения m["SSD"] = 30; // вставка нового значения print_map("2) Обновленный map: ", m); // Использование operator[] с несуществующим ключом всегда выполняет вставку std::cout << "3) m[UPS] = " << m["UPS"] << '\n'; print_map("4) Обновленный map: ", m); m.erase("GPU"); print_map("5) После удаления: ", m); std::erase_if(m, [](const auto& pair){ return pair.second > 25; }); print_map("6) После удаления: ", m); std::cout << "7) m.size() = " << m.size() << '\n'; m.clear(); std::cout << std::boolalpha << "8) Map пуст: " << m.empty() << '\n'; }
Вывод:
1) Initial map: [CPU] = 10; [GPU] = 15; [RAM] = 20; 2) Updated map: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; 3) m[UPS] = 0 4) Updated map: [CPU] = 25; [GPU] = 15; [RAM] = 20; [SSD] = 30; [UPS] = 0; 5) After erase: [CPU] = 25; [RAM] = 20; [SSD] = 30; [UPS] = 0; 6) After erase: [CPU] = 25; [RAM] = 20; [UPS] = 0; 7) m.size() = 3 8) Map is empty: true
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 230 | C++98 |
Key
was not required to be
CopyConstructible
(a key of type
Key
might not be able to be constructed)
|
Key
is also required to
be CopyConstructible |
| LWG 464 | C++98 |
accessing a const
map
by key was inconvenient
|
at
function provided
|
Смотрите также
|
коллекция пар ключ-значение, отсортированная по ключам
(шаблон класса) |
|
|
(C++11)
|
коллекция пар ключ-значение, хэшированная по ключам, ключи уникальны
(шаблон класса) |
|
(C++23)
|
адаптирует два контейнера для предоставления коллекции пар ключ-значение, отсортированной по уникальным ключам
(шаблон класса) |