25.06.2025
4 минут чтения

Multimap в C++: что это, как работает и когда использовать?

Multimap в C++

Ты вообще хоть раз задумывался, зачем в C++ столько контейнеров? Map, set, vector — ладно, привычно. Но вот появляется он — загадочный multimap. И если ты когда-нибудь гуглил “что такое multimap в C++” или “как работает multimap в C++”, то добро пожаловать. Сейчас разложим всё по полочкам — от базовой теории до фишек, которые реально можно использовать в проде.

Но если ты еще новичок в программирования, то курс C++ Start — это как раз то, что сможет тебе начать с базы. Больше курсов от компании FoxmindEd смотри на сайте. 

🚀 Добро пожаловать в мир C++ с нашим курсом C++ Start! 📚 Скажите «прощай» избыточным материалам и 💡 «привет» мгновенному погружению в программирование!
Узнать больше

Что такое multimap в C++?

Начнём с базы. Что такое multimap в C++? Это ассоциативный контейнер из стандартной библиотеки C++. Он хранит пары “ключ — значение”, при этом допускает дублирующиеся ключи. Да-да, в отличие от std::map, где ключ должен быть уникальным, тут можно впихнуть сколько угодно значений под одним и тем же ключом — и никто не скажет тебе, что так делать нельзя.

Под капотом std::multimap реализован как самобалансирующееся бинарное дерево поиска (обычно это красно-чёрное дерево). Это значит, что операции вставки, поиска и удаления работают за логарифмическое время. Как видишь, всё красиво и по науке.

Чем отличается от обычного map? Вот список на пальцах:

  • map: уникальные ключи, по одному значению.
  • multimap: один ключ — много значений. Без глупых ограничений.

Как видишь, multimap в C++ для хранения дубликатов становится удобным инструментом для задач, где ключи могут повторяться.

Как работает multimap в C++?

Принцип работы контейнера схож с обычным map, но с одной важной особенностью — поддержкой дубликатов. Каждый элемент здесь сохраняется в порядке ключей, и для каждого ключа может быть несколько значений.

Структура и операции:

  1. C++ multimap пример: если ты добавляешь пару (ключ, значение), и ключ уже существует, то новое значение добавляется к старому, а не заменяет его.
  2. Вставка, поиск и удаление — всё в пределах O(log n), потому что под капотом у multimap самосортирующееся бинарное дерево.

Хочешь узнать multimap C++ размер контейнера? Всё просто:

std::cout << "Container size: " << mmap.size() << std::endl;  // Выведет 2

Метод size() вернёт общее количество пар, включая все дубликаты. То есть, если у одного ключа три значения — они все идут в счёт.

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

Multimap в C++ для хранения дубликатов

Представь себе ситуацию: у тебя есть база заказов, и нужно хранить заказы по ID клиента. Один клиент может сделать много заказов. Что делать?

Ты просто делаешь orders.insert({clientId, orderInfo}); и не думаешь, сколько заказов было у клиента. Всё автоматически складывается под нужный ключ, и ты легко получаешь доступ ко всем его заказам.

Фишка multimap — в простоте и лаконичности, когда тебе реально надо обрабатывать дубликаты. И это не какая-то экзотика, а частая бизнес-логика: логгирование, аналитика, сортировки, индексированные коллекции.

Итерация по multimap в C++

Не забывай, что у multimap C++ итерации может быть несколько методов.  Итерация — это ключевая операция, поскольку контейнер всегда отсортирован по ключам.

Итерация с использованием стандартного итератора

Если тебе нужно пройтись по всем элементам, стандартный итератор будет самым простым вариантом. Ты получаешь пары ключ-значение в том порядке, в котором они хранятся:

std::multimap<int, std::string> mmap;

mmap.insert({1, "apple"});

mmap.insert({1, "banana"});

for (auto it = mmap.begin(); it != mmap.end(); ++it) {

    std::cout << it->first << ": " << it->second << std::endl;

}

Итерация с использованием range-based for

Если хочешь сократить код, используй range-based for. Это позволяет перебирать элементы ещё проще и быстрее:

for (const auto& pair : mmap) {

    std::cout << pair.first << ": " << pair.second << std::endl;

}

Удаление элементов из multimap в C++

Удаление всех значений по ключу

Ну, здесь все просто. Когда нужно multimap c++ удалить элемент по ключу, делаем следующее:

scores.erase("John");

И всё, Джон больше не с нами. Точнее, в multimap. Эта операция удаляет все значения по заданному ключу.

Удаление конкретного значения

А вот если хочешь удалить только одно значение под ключом — придется немного пошаманить:

auto range = scores.equal_range("John");

for (auto it = range.first; it != range.second; ++it) {

    if (it->second == 95) {

        scores.erase(it);

        break;

    }

}

Вот так и происходит multimap C++ удаление элементов. Не то чтобы rocket science, но неочевидно, если ты не в теме.

Подпишитесь на наш Ютуб-канал! Полезные видео для программистов уже ждут вас! YouTube
Выберите свой курс! Путь к карьере программиста начинается здесь! Посмотреть

Multimap в C++ – примеры использования

Multimap C++ отлично подходит для ситуаций, где нужно хранить данные с повторяющимися значениями. Рассмотрим несколько примеров.

  • Сортировка и группировка данных: если нужно сортировать элементы и при этом хранить несколько значений для одного ключа.
  • Хранение логов: когда нужно хранить логи с временными метками, где для одного времени записи могут быть несколько событий.

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

В остальном же случае — лучше использовать multimap C++.

Заключение

Подведём итоги. Multimap в C++ — мощный инструмент, когда тебе нужно хранить несколько значений под одним ключом без лишнего шаманства. Он отлично подходит для логов, аналитики, словарей, группировок и всего, где дубликаты — не баг, а фича.

FAQ
Это ассоциативный контейнер, который хранит пары "ключ — значение" и допускает дубликаты ключей.
В map ключи уникальны, а в multimap одному ключу может соответствовать несколько значений.
Когда нужно хранить повторяющиеся значения по одному ключу — например, заказы клиента или лог-файлы.
С помощью обычных или range-based итераторов, получая элементы в отсортированном порядке по ключу.
Можно удалить все значения по ключу или только одно конкретное значение, пройдясь по диапазону.
Он прост, предсказуем, оптимизирован по времени (логарифмические операции) и отлично справляется с дубликатами.

Хотите узнать больше о multimap в C++? Задайте свой вопрос или поделитесь комментарием ниже! 🤔👇👇

Добавить комментарий

Ваш имейл не будет опубликован. Обязательные поля отмечены *

Сохранить моё имя, имейл и адрес сайта в этом браузере для будущих комментариев

foxmindED
IТ-жара: Скидка 20% на стартовые курсы!
до конца акции
00
дней
00
годин
00
минут
Забронировать