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
ІТ-спека: Знижка 20% на стартові курси!
до кінця акції
00
днів
00
годин
00
хвилин
Забронювати