Ассоциативные контейнеры: map, set и unordered_map
std::map
std::map хранит пары ключ-значение в отсортированном порядке ключей. Ключи уникальны, а поиск, вставка и удаление обычно имеют логарифмическую сложность.
#include <map>#include <string>std::map<std::string, int> scores;scores["Alex"] = 100;scores["Sam"] = 80;Обрати внимание: operator[] добавляет ключ, если его ещё нет, и создаёт значение по умолчанию. Для поиска без вставки используй find() или contains() (C++20).
std::set
std::set хранит уникальные значения в отсортированном порядке:
std::set<int> ids{4, 2, 4, 1};// в наборе будут 1, 2 и 4unordered_map и unordered_set
Неупорядоченные варианты используют хеширование. В среднем поиск и вставка имеют близкую к константной сложность, но худший случай может быть линейным, а порядок обхода не гарантируется.
Для собственных типов в unordered_map нужно предоставить подходящий хеш и сравнение на равенство.
Обработка отсутствующего ключа
auto it = scores.find("Taylor");if (it != scores.end()) { std::cout << it->second << '\n';}find() возвращает итератор на элемент или end(). Не разыменовывай end().
Что выбрать
map— важен отсортированный порядок или предсказуемая логарифмическая сложность.unordered_map— нужен быстрый поиск по ключу, порядок не важен.set/unordered_set— хранение уникальных значений без сопоставленного значения.
Итог
Ассоциативные контейнеры упрощают поиск по ключам и уникальность. Выбирай упорядоченный или хешированный контейнер по требованиям к порядку, типу ключа и реальным нагрузкам.
