0Pricing
C++ Academy · Урок

std::unordered_map

Быстрый поиск на основе хеширования

«std::unordered_map» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Что такое неупорядоченное отображение

std::unordered_map хранит пары «ключ–значение» в хеш-таблице. В среднем поиск, вставка и удаление выполняются за константное время, но элементы не имеют отсортированного порядка.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> ages;
    ages["Alice"] = 30;
    ages["Bob"] = 25;
    std::cout << ages["Alice"] << '\n';
    return 0;
}

Отображение и неупорядоченное отображение

Выбирайте контейнер в зависимости от задачи:

  • map: отсортированный, операции выполняются за O(log n).
  • unordered_map: неупорядоченный, средняя сложность операций — O(1).

Используйте неупорядоченное отображение, когда Вам нужен только быстрый поиск.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, std::string> m{{3, "c"}, {1, "a"}, {2, "b"}};
    std::cout << m.size() << " entries (order not guaranteed)\n";
    return 0;
}

Вставка и обновление

Используется тот же интерфейс, что и у map: применяйте [], insert() или emplace().

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    m["x"] = 1;
    m.insert({"y", 2});
    m.emplace("z", 3);
    std::cout << m.size() << '\n';
    return 0;
}

Поиск с помощью find

find() возвращает итератор или end(). Это предотвращает случайную вставку значения по умолчанию, которая произошла бы при использовании [].

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}};
    auto it = m.find("a");
    if (it != m.end()) std::cout << it->second << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

Проверка наличия

count() возвращает 0 или 1, а в C++20 появился contains() для понятной проверки с булевым результатом.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"key", 99}};
    std::cout << m.count("key") << '\n';
    std::cout << m.count("missing") << '\n';
    return 0;
}

Итерация

Перебирать элементы можно, но порядок не определён. Никогда не полагайтесь на то, что он будет отсортированным или соответствующим порядку вставки.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
    int total = 0;
    for (const auto& [k, v] : m) total += v;
    std::cout << "sum = " << total << '\n';
    return 0;
}

Удаление

erase() удаляет элементы по ключу и возвращает количество удалённых элементов.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}};
    m.erase("a");
    std::cout << m.count("a") << ' ' << m.size() << '\n';
    return 0;
}

Быстрый подсчёт частот

Для больших наборов данных, когда порядок не имеет значения, неупорядоченное отображение подсчитывает частоты быстрее, чем map.

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::string items[] = {"a", "b", "a", "c", "b", "a"};
    std::unordered_map<std::string, int> freq;
    for (const auto& s : items) freq[s]++;
    std::cout << "a appears " << freq["a"] << " times\n";
    return 0;
}

Использование at()

at() возвращает ссылку и выбрасывает исключение std::out_of_range для отсутствующего ключа, не вставляя его.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"score", 42}};
    std::cout << m.at("score") << '\n';
    return 0;
}

Вставка по умолчанию через []

Обращение к отсутствующему ключу с помощью [] вставляет его со значением, инициализированным по умолчанию (для целых чисел это 0). Будьте внимательны: размер отображения увеличивается незаметно.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    std::cout << m["new"] << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

Очистка отображения

clear() очищает таблицу, а empty() сообщает, не содержит ли она элементов.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, int> m{{1, 1}, {2, 2}};
    m.clear();
    std::cout << std::boolalpha << m.empty() << '\n';
    return 0;
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли порядок элементов в неупорядоченном отображении.

Повторение

Вы узнали, что std::unordered_map:

  • использует хеш-таблицу для выполнения операций со средней сложностью O(1)
  • не имеет гарантированного порядка
  • предоставляет тот же интерфейс, что и map (find, count, at, erase)

Далее Вы познакомитесь с unordered_set для быстрого хранения уникальных элементов.

Часто задаваемые вопросы

Урок «std::unordered_map» бесплатный?

Да — полный текст урока «std::unordered_map» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «std::unordered_map»?

Быстрый поиск на основе хеширования Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «std::unordered_map»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. std::unordered_map
  2. unordered_set
  3. Пользовательские хеш-функции
  4. Вопросы производительности
← Назад к C++ Academy