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 — локальная установка не требуется.
Все уроки этого курса
- std::unordered_map
- unordered_set
- Пользовательские хеш-функции
- Вопросы производительности