интерактивный урок

map в C++

Если set — это коробка уникальных элементов, то mapсловарь: к каждому ключу привязано значение. Телефонная книга, подсчёт голосов, частоты букв — всё это map.

История: голосование в классе

💡 map = «словарь: ключ → значение, ключи всегда отсортированы».

В классе голосуют за лучший фильм. Каждый ученик называет название. Тебе нужно посчитать, сколько голосов у каждого фильма, и назвать победителя.

Без map: создаёшь массив названий, для каждого нового голоса ищешь линейно — O(n). С map: votes["Inception"]++O(log n).

КонтейнерЧто хранитПоиск по ключуПорядок
vector<pair>ПарыO(n)Как добавили
mapКлюч → значениеO(log n)По ключу

Первый взгляд: создаём словарь

Ключевое свойство: mp[key] создаёт запись, если ключа нет. Значение по умолчанию для int — 0.

map_intro.cpp шаг 1 из 6

Создали map: ключ — string, значение — int.

Все операции map и Big O

ОперацияКодСложностьЧто делает
Доступ / созданиеmp[key]O(log n)Значение по ключу (создаёт, если нет)
Поискmp.find(key)O(log n)Итератор или end()
Проверкаmp.count(key)O(log n)0 или 1
Удалениеmp.erase(key)O(log n)Удаляет пару
Размерmp.size()O(1)Кол-во пар
Обходfor (auto [k, v] : mp)O(n)По возрастанию ключа
map_ops.cpp шаг 1 из 4

mp["cat"] = 3 — создали запись.

Магия operator[]

⚠️ Осторожно: mp[key] создаёт ключ со значением 0, если его нет. Для проверки без создания используй mp.count(key) или mp.find(key).

Главная фишка map — mp[key]++ работает даже если ключа ещё нет:

map_bracket.cpp шаг 1 из 5

mp пустой. mp[5] создаёт запись 5 → 0.

Задача 1: подсчёт частот

Условие. Дан массив чисел. Выведи, сколько раз встречается каждое число.

Это самый частый паттерн с map в контестах: frequency counting.

frequency.cpp шаг 1 из 4

freq хранит: число → сколько раз встретилось.

Пример: a = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]

Вывод:

text
1: 2
2: 1
3: 2
4: 1
5: 2
6: 1
9: 1

Сложность: O(n log n) по времени, O(k) по памяти, где k — количество различных значений.

Задача 2: самый частый элемент (mode)

Условие. Найди число, которое встречается чаще всего.

Идея: сначала считаем частоты, потом ищем максимум.

mode.cpp шаг 1 из 5

Шаг 1: считаем частоты (уже знакомый паттерн).

Сложность: O(n log n) — на подсчёт частот. Поиск максимума — O(k).

Задача 3: частота слов

🏆 Задача C из AQL Contest #9 (Maximum Word Frequency) решается именно так — map<string, int> + поиск максимума.

Условие. Дано n слов. Для каждого слова выведи частоту.

Точно такой же паттерн, но ключ — string:

word_freq.cpp шаг 1 из 3

map<string, int> — ключ это слово, значение это кол-во.

Задача 4: суммирование по ключу

💡 Это ровно то, что нужно в задаче G (Maps-STL) из AQL Contest #9: запрос 1 — mp[name] += score, запрос 2 — mp.erase(name), запрос 3 — cout << mp[name].

Условие. Дано n пар (имя, баллы). Посчитай суммарный балл каждого.

accumulate.cpp шаг 1 из 3

Для каждой пары (name, score) прибавляем score к total[name].

Советы для контестов

Ситуацияmapunordered_map
Нужен порядок ключейДаНет
Поиск / вставкаO(log n)O(1) среднее
НадёжностьВсегда O(log n)O(n) при коллизиях
Лексикографический обходАвтоматическиНужна сортировка

Частые ошибки:

  • mp[key] создаёт запись. Не используй для проверки — используй count.
  • Не забывай, что for (auto [k, v] : mp)копия. Для модификации: for (auto& [k, v] : mp).

Проверь себя

Что делает freq[x]++, если ключа x ещё не было?

Какова сложность mp.find(key) для std::map?

В каком порядке map обходит пары?

map<string,int> mp; mp["a"]=1; mp["b"]=2; cout << mp.size();

Итог

map + set — это фундамент для задач на статистику, строки и события в контестах!

std::map — базовый инструмент для:

  • Подсчёта частотfreq[x]++
  • Суммирования по ключуtotal[name] += score
  • Сортированного обхода — ключи автоматически в порядке
  • Быстрого поиска по ключу — O(log n)

Паттерны:

  1. Frequency map — считай частоты одной строкой
  2. Accumulate — суммируй по ключу
  3. Mode — найди самый частый через max по cnt
© 2026 aqlacademy.kz