Ти взагалі хоч раз замислювався, навіщо в C++ стільки контейнерів? Map, set, vector – гаразд, звично. Але ось з’являється він – загадковий multimap. І якщо ти коли-небудь гуглив “що таке multimap в C++” або “як працює multimap в C++”, то ласкаво просимо. Зараз розкладемо все по поличках – від базової теорії до фішок, які реально можна використовувати в проді.
Але якщо ти ще новачок у програмування, то курс C++ Start – це якраз те, що зможе тобі почати з бази. Більше курсів від компанії FoxmindEd дивись на сайті.
Що таке multimap у C++?
Почнемо з бази. Що таке multimap у C++? Це асоціативний контейнер зі стандартної бібліотеки C++. Він зберігає пари “ключ – значення”, при цьому допускає дубльовані ключі. Так-так, на відміну від std::map, де ключ має бути унікальним, тут можна впихнути скільки завгодно значень під одним і тим самим ключем – і ніхто не скаже тобі, що так робити не можна.
Під капотом std::multimap реалізовано як самобалансоване бінарне дерево пошуку (зазвичай це червоно-чорне дерево). Це означає, що операції вставки, пошуку і видалення працюють за логарифмічний час. Як бачиш, усе красиво і по науці.
Чим відрізняється від звичайного map? Ось список на пальцях:
- map: унікальні ключі, по одному значенню.
- multimap: один ключ – багато значень. Без дурних обмежень.
Як бачиш, multimap у C++ для зберігання дублікатів стає зручним інструментом для завдань, де ключі можуть повторюватися.
Як працює multimap у C++?
Принцип роботи контейнера схожий зі звичайним map, але з однією важливою особливістю – підтримкою дублікатів. Кожен елемент тут зберігається в порядку ключів, і для кожного ключа може бути кілька значень.
Структура та операції:
- C++ multimap приклад: якщо ти додаєш пару (ключ, значення), і ключ уже існує, то нове значення додається до старого, а не замінює його.
- Вставка, пошук і видалення – все в межах 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, але неочевидно, якщо ти не в темі.
Multimap у C++ – приклади використання
Multimap C++ чудово підходить для ситуацій, де потрібно зберігати дані з повторюваними значеннями. Розглянемо кілька прикладів.
- Сортування і групування даних: якщо потрібно сортувати елементи і при цьому зберігати кілька значень для одного ключа.
- Зберігання логів: коли потрібно зберігати логи з тимчасовими мітками, де для одного часу запису може бути кілька подій.
Якщо порівнювати з іншими контейнерами, то для простого зберігання пар “ключ-значення”, де дублікати не важливі, краще підійде map.
В іншому ж випадку – краще використовувати multimap C++.
Висновок
Підіб’ємо підсумки. Multimap у C++ – потужний інструмент, коли тобі потрібно зберігати кілька значень під одним ключем без зайвого шаманства. Він чудово підходить для логів, аналітики, словників, угруповань і всього, де дублікати – не баг, а фіча.
Хочете дізнатися більше про multimap у C++? Задайте своє питання або поділіться коментарем нижче! 🤔👇👇