std::map в C++: полное руководство с примерами кода
Что такое std::map?
В стандартной библиотеке шаблонов C++ (STL) std::map — ассоциативный контейнер, хранящий элементы как пары ключ-значение. Каждый ключ уникален, и контейнер автоматически поддерживает элементы отсортированными по функции сравнения ключей (по умолчанию std::less). Значения могут быть любого типа и доступны через соответствующие ключи.
Зачем использовать std::map?
- Ключи уникальны и хранятся в отсортированном порядке, обеспечивая быстрый поиск (
O(log n)). - Идеален для сценариев, требующих ассоциативный массив или словарь с гарантированным порядком.
- Внутренне реализован как сбалансированное бинарное дерево поиска (красно-чёрное дерево), дающее надёжную производительность во всех операциях.
- Поддерживает быструю вставку, удаление и обход.
- Богатое API, бесшовно интегрирующееся с итераторами и алгоритмами STL.
Синтаксис
Объявление map:
std::map<KeyType, ValueType> mapName;
KeyType — тип ключа (должен быть сравнимым).ValueType — тип отображаемого значения.mapName — имя переменной.
Пример:
std::map<std::string, int> ageMap;
Типы-члены
- key_type: тип ключей.
- mapped_type: тип значений.
- value_type:
std::pair<const key_type, mapped_type> - iterator: двунаправленный итератор по
value_type. - const_iterator, reverse_iterator, const_reverse_iterator
- size_type, difference_type
Встроенные функции
begin()— итератор на первый элемент.end()— итератор за последним.size()— число элементов.empty()— пуст ли map.insert()— добавить пару ключ/значение.find()— найти элемент по ключу.erase()— удалить элементы по итератору или ключу.clear()— удалить все элементы.- Другие утилиты:
count(),lower_bound()и др.
Итерация по элементам map
Итераторы дают полный контроль над порядком обхода, который всегда отсортирован по ключу.
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
map<int, string> students;
students.insert({200, "Alice"});
students.insert({201, "John"});
cout << "Map size is: " << students.size() << endl;
cout << endl << "Default map order:" << endl;
for (auto it = students.begin(); it != students.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
return 0;
}
Вывод:

Вставка данных в std::map
Используйте insert() для новых записей; он молча игнорирует дубликаты. Для перезаписи существующего ключа используйте insert_or_assign().
#include <map>
#include <iostream>
using namespace std;
int main() {
map<int, int> m{{1,3},{2,4},{3,5}};
m.insert({5,6}); // добавляет новую пару
m.insert({1,8}); // игнорируется, ключ 1 уже есть
m.insert_or_assign(1,6); // обновляет ключ 1 значением 6
cout << "Key\tElement\n";
for (auto& p : m) {
cout << p.first << '\t' << p.second << '\n';
}
return 0;
}
Вывод:

Поиск в map
Поиск ключа прост с find(). Если ключ есть, возвращённый итератор указывает на элемент; иначе возвращается end().
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> students;
students.insert({200, "Alice"});
students.insert({201, "John"});
if (auto it = students.find(201); it != students.end()) {
cout << "Key 201 has value: " << it->second << endl;
}
return 0;
}
Вывод:

Удаление данных из map
Элементы можно удалять по ключу или по итератору. Метод erase() инвалидирует только итераторы, указывающие на удалённый элемент.
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> myMap;
myMap["cow"] = 1;
myMap["cat"] = 2;
myMap["lion"] = 3;
if (auto it = myMap.find("cat"); it != myMap.end()) {
myMap.erase(it);
}
for (auto& p : myMap) {
cout << p.first << ": " << p.second << endl;
}
return 0;
}
Вывод:

Резюме
std::map— отсортированный ассоциативный контейнер с уникальными ключами.- Ключи обеспечивают эффективный поиск; значения хранят ассоциированные данные.
- Все основные операции выполняются за логарифмическое время благодаря красно-чёрному дереву.
- Итераторы позволяют обход, вставку, удаление и диапазонные запросы.
- С
insert_or_assign()обновление значений становится прямолинейным. - Используйте
find()для быстрых проверок существования и прямого доступа. - Операции удаления могут быть точечными или очищать весь map.
Язык C
- Стандартные библиотечные функции в C: практическое руководство
- Операторы в C++: типы, примеры и практические программы
- Цикл do-while в C++: синтаксис, примеры и вложенные циклы
- Оператор switch-case в C++: синтаксис, применение и практические примеры
- Динамическое выделение массивов в C++: практическое руководство с примерами кода
- Указатели в C++: концепции, примеры и практические применения
- Перегрузка операторов в C++: практическое руководство с примерами кода
- Освоение std::list в C++: синтаксис, функции и практические примеры
- Функции в C++: подробное объяснение с практическими примерами кода
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования