std::map
| Определено в заголовочном файле <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_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, специализация
| ||||
Классы элементы
сравнивает объекты типа 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++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()
{
// Создаём карту из трёх строк (которые отображаются на целые числа)
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, [](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) Карта пуста: " << 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
|