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>

<unordered_map>

Когда выбирать

нужен порядок ключей

максимальная скорость

Коротко

  • 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По значению
Поддержать проект