Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Ассоциативные контейнеры: map, set и unordered_map

Страница 33 из 43 · 2026-10-25 · 1 мин чтения

Ассоциативные контейнеры: 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 и 4

unordered_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 — хранение уникальных значений без сопоставленного значения.

Итог

Ассоциативные контейнеры упрощают поиск по ключам и уникальность. Выбирай упорядоченный или хешированный контейнер по требованиям к порядку, типу ключа и реальным нагрузкам.