Namespaces
Variants

std:: map

From cppreference.net
Определено в заголовочном файле <map>
template <

class Key,
class T,
class Compare = std:: less < Key > ,
class Allocator = std:: allocator < std:: pair < const Key, T >>

> class map ;
(1)
namespace pmr {

template <
class Key,
class T,
class Compare = std:: less < Key >
> using map = std :: map < Key, T, Compare,
std:: pmr :: polymorphic_allocator < std:: pair < const Key, T >>> ;

}
(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 при вычислении константного выражения.

Однако, объекты std::map обычно не могут быть constexpr , поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.

(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

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 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 >
struct /*unspecified*/
{
Iter     position ;
bool inserted ;
NodeType node ;
} ;

инстанцированная с шаблонными аргументами iterator и node_type .

Классы-члены

сравнивает объекты типа value_type
(класс)

Функции-члены

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

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