std::map и unordered_map в C++
std::map и std::unordered_map в C++: словарь «ключ-значение», вставка, поиск, перебор и итераторы.
std::map хранит пары ключ-значение в упорядоченном виде. std::unordered_map хранит то же самое, но без сортировки — зато быстрее. Оба — как словарь: мгновенный доступ по ключу.
Создание и добавление
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> ages;
ages["Аня"] = 25;
ages["Боря"] = 30;
ages["Вика"] = 22;
std::cout << "Возраст Бори: " << ages["Боря"] << "\n";
std::cout << "Размер: " << ages.size() << "\n";
return 0;
}
Вывод:
Возраст Бори: 30 Размер: 3
Обращение через
[]с несуществующим ключом создаёт запись со значением по умолчанию (0 для int). Это может быть сюрпризом. Для проверки используйтеcount()илиfind().
find и count
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> scores;
scores["Алиса"] = 95;
scores["Боб"] = 80;
// Безопасный поиск
if (scores.count("Алиса")) {
std::cout << "Алиса: " << scores["Алиса"] << "\n";
}
auto it = scores.find("Карл");
if (it == scores.end()) {
std::cout << "Карл не найден\n";
}
return 0;
}
Вывод:
Алиса: 95 Карл не найден
Перебор через итераторы
В std::map ключи перебираются в отсортированном порядке:
#include <iostream>
#include <map>
int main() {
std::map<std::string, int> fruit_count;
fruit_count["яблоко"] = 5;
fruit_count["банан"] = 3;
fruit_count["вишня"] = 8;
for (const auto& [key, val] : fruit_count) { // C++17 structured bindings
std::cout << key << " : " << val << "\n";
}
return 0;
}
Вывод:
банан : 3 вишня : 8 яблоко : 5
map vs unordered_map
Критерий | std::map | std::unordered_map |
Упорядоченность | ключи отсортированы | порядок не гарантирован |
Сложность поиска | O(log n) | O(1) в среднем |
Заголовок |
|
|
Когда выбирать | нужен порядок ключей | максимальная скорость |
Коротко
map<K, V>— словарь с упорядоченными ключами;unordered_map— без порядка, но быстрее.- Вставка через
[]илиinsert(); осторожно:[]создаёт запись при обращении к несуществующему ключу. - Проверяйте наличие через
count(ключ)илиfind()перед обращением. - Перебор через range-for даёт пары
{key, value}; вmap— в алфавитном порядке.
Проверьте себя
1. Что произойдёт при обращении m["ключ"], которого нет?
AВыброс исключения
BЗапись со значением по умолчанию будет создана
CВернётся nullptr
DОшибка компиляции
2. В каком порядке map хранит ключи?
AВ порядке вставки
BВ отсортированном по возрастанию
CВ случайном
DПо значению