Пространства имён
Варианты
Действия

std::map

Материал из cppreference.com
< cpp‎ | container
 
 
 
std::map
Функции элементы
Доступ к элементам
Итераторы
Ёмкость
Модификаторы
(C++17)
Просмотр
Наблюдатели
Функции, не являющиеся элементами
(C++20)
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Принципы вывода(C++17)
 
Определено в заголовочном файле <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. Операции поиска, удаления и вставки имеют логарифмическую сложность. Карты обычно реализуются как красно-чёрные деревья.

Везде, где стандартная библиотека использует требования Compare, уникальность определяется с помощью отношения эквивалентности. Грубо говоря, два объекта a и b считаются эквивалентными (не уникальными), если ни один из них при сравнении не меньше, чем другой: !comp(a, b)&&!comp(b, a).

std::map соответствует требованиям Container, AllocatorAwareContainer, AssociativeContainer и ReversibleContainer.

Содержание

[править]Параметры шаблона

[править]Типы элементы

Тип элемент Определение
key_typeKey[править]
mapped_typeT[править]
value_typestd::pair<const Key, T>[править]
size_type Беззнаковый целочисленный тип (обычно std::size_t) [править]
difference_type Знаковый целочисленный тип (обычно std::ptrdiff_t) [править]
key_compareCompare[править]
allocator_typeAllocator[править]
referencevalue_type&[править]
const_referenceconst 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)
[править]
iteratorLegacyBidirectionalIterator в value_type[править]
const_iteratorLegacyBidirectionalIterator в const value_type[править]
reverse_iteratorstd::reverse_iterator<iterator>[править]
const_reverse_iteratorstd::reverse_iterator<const_iterator>[править]
node_type(начиная с C++17) специализация дескриптора узла, представляющая узел контейнера [править]
insert_return_type(начиная с C++17) тип, описывающий результат вставки node_type, специализация

template<class Iter, class NodeType>struct/*неопределена*/{
    Iter     position;
    bool     inserted;
    NodeType node;
};

создаётся с аргументами шаблона iterator и node_type. [править]

[править]Классы элементы

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

[править]Функции элементы

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

[править]Примечание

Макрос тест функциональностиЗначениеСтандартКомментарий
__cpp_lib_containers_ranges202202L(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
close