68 / 90

C++ std::unordered_multimap

C++ tartibsiz multimaplari STL multimaps bo'lib, unda elementlar tartiblangan tartibda saqlanmaydi.

Tartibsiz multimapdagi elementlar kalitlari yoki qiymatlari asosida tartiblanmaydi. Buning o'rniga, ular kalit orqali tez to'g'ridan-to'g'ri kirish uchun xesh qiymatlari yordamida chelaklarga ajratiladi, bu esa doimiy o'rtacha vaqt murakkabligini keltirib chiqaradi.

Kalit va qiymatning ma'lumotlar turi farq qilishi mumkin.

Tartibsiz multimap yarating

C++ da tartibsiz multimap yaratish uchun avval <unordered_map> sarlavha faylini kiritishimiz kerak.

example.cpp
#include <unordered_map>

Tartibsiz multimapni ishga tushirish sintaksisi

example.cpp
std::unordered_multimap<int, std::string> my_unordered_multimap;

Bu kalit-qiymat juftlarini saqlash uchun my_unordered_multimap nomli tartibsiz multimapni yaratadi, bu erda kalit turi int va qiymat turi std::string .

[!NOTE] Qo'llanma davomida biz std nom maydonidan foydalanamiz. Shunday qilib, sintaksis std ni o'z ichiga olmaydi. unordered_multimap<int, string> my_unordered_multimap;

Misol: C++ tartibsiz multimap

example.cpp
#include <iostream>
#include <unordered_map>  
using namespace std;

int main() {

    // tartibsiz_ko'p xarita yarating
    // butun sonli kalitlar va satr qiymatlari bilan
    unordered_multimap<int, string> my_unordered_multimap {
        {1, "Apple"},
        {22, "Banana"},
        {1, "Apricot"},
        {3, "Avocado"}
    };

    // elementlarni chop eting
    cout << "Unordered Multimap Elements:" << endl;
    for (const auto& pair : my_unordered_multimap) {
        cout << pair.first << ": " << pair.second << endl;
    }

    return 0;
}

Chiqish

kod
Unordered Multimap Elements:
3: Avocado
22: Banana
1: Apricot
1: Apple

Bu yerda biz my_unordered_multimap nomli tartibsiz multimapni yaratdik, uning ikkita elementi bir xil kalit 1ni baham ko'radi.

Ko'rib turganingizdek, elementlar tartiblangan tartibda saqlanmaydi.

Kodga e'tibor bering,

example.cpp
for (const auto& pair : my_unordered_multimap) {
    cout << pair.first << ": " << pair.second << endl;
}

Bu erda sikl o'zgaruvchilari juftligi my_unordered_multimap-da mavjud kalit-qiymat juftlarini saqlaydi. Keyin pair.first yordamida kalitga va pair.second yordamida qiymatga kirishimiz mumkin.

C++ std::unordered_multimap usullari

Tartibsiz multimaplar uchun eng ko'p ishlatiladigan usullardan ba'zilari quyida keltirilgan:

Usullar tavsifi insert() Multimapga elementlarni kiritadi. find() Berilgan kalitning qiymatini topadi. count() Muayyan kalit bilan elementlar sonini hisoblaydi. empty() Multimap bo'sh yoki yo'qligini tekshiradi. size() Multimap hajmini tekshiring. erase() Elementni multimapdan o'chiradi. clear() Multimapdagi barcha qiymatlarni o'chiradi.

Tartibsiz multimapga elementlar qo'shing

insert() funksiyasidan foydalanib tartibsiz multimapga elementlar qo'shishimiz mumkin. Masalan,

example.cpp
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {

    unordered_multimap<string, int> my_unordered_multimap;

    // bitta kalit-qiymat juftlarini kiriting
    my_unordered_multimap.insert({"apple", 5});
    my_unordered_multimap.insert({"banana", 3});

    // bir nechta kalit-qiymat juftlarini kiriting
    my_unordered_multimap.insert({{"apple", 2}, {"cherry", 4}});

    // tartibsiz multimapni chop eting
    cout << "Elements inserted into unordered multimap:" << endl;
    for (const auto& pair : my_unordered_multimap) {
        cout << pair.first << " -> " << pair.second << endl;
    }

    return 0;
}

Chiqish

kod
Elements inserted into unordered multimap:
cherry -> 4
banana -> 3
apple -> 5
apple -> 2

Tartibsiz multimapda kalitni toping

Muayyan kalitga ega elementlarni topish uchun find() funksiyasidan foydalanishimiz mumkin.

find() funksiyasi qaytadi

  • kalit topilsa, elementga iterator
  • kalit topilmasa, konteynerning oxirigacha iterator

Masalan,

example.cpp
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {

    unordered_multimap<string, int> my_unordered_multimap;

    my_unordered_multimap.insert({"apple", 5});
    my_unordered_multimap.insert({"banana", 3});
    my_unordered_multimap.insert({"apple", 2});
    my_unordered_multimap.insert({"cherry", 4});

    // "olma" kaliti bilan elementlarni toping
    string key_to_find = "apple";
    auto found = my_unordered_multimap.find(key_to_find);

    // topilgan kalitni chop eting
    if (found != my_unordered_multimap.end()) {
        cout << "Found key " << key_to_find << ": " << endl;
        cout << found->first << " - " << found->second << endl;
    }
    else {
        cout << "Key " << key_to_find << " not found." << endl;
    }

    return 0;
}

Chiqish

kod
Found key apple: 
apple - 5

Misoldan ko'rinib turibdiki, find() funksiyasi multimapdagi kalitning faqat birinchi nusxasini qaytaradi.

Kalitning paydo bo'lishini hisoblang

count() funksiyasidan foydalanib, ma'lum bir kalitning takrorlanish sonini hisoblashimiz mumkin. Masalan,

example.cpp
#include <iostream>
#include <unordered_map>

using namespace std;

int main() {

    unordered_multimap<string, int> my_unordered_multimap;

    my_unordered_multimap.insert({"apple", 5});
    my_unordered_multimap.insert({"banana", 3});
    my_unordered_multimap.insert({"apple", 2});
    my_unordered_multimap.insert({"cherry", 4});

    // ma'lum bir kalit bilan elementlar sonini hisoblash
    string key_to_count = "apple";
    int count = my_unordered_multimap.count(key_to_count);
    cout << "Count of key " << key_to_count << ": " << count << endl;

    return 0;
}

Chiqish

kod
Count of key apple: 2

Bu erda biz apple kaliti yordamida qiymatlar sonini hisoblash uchun count() funksiyasidan foydalandik. Funksiya 2 qiymatini qaytaradi, ya'ni bu kalit bilan ikkita qiymat mavjud.

Tartibsiz multimap hajmini tekshiring

empty() funksiyasi yordamida multimapning bo‘shligini tekshirishimiz va size() funksiyasidan foydalanib uning hajmini hisoblashimiz mumkin.

empty() funksiyasi qaytadi

  • rost - agar multimap bo'sh bo'lsa.
  • noto'g'ri - agar multimap bo'sh bo'lmasa.

Va size() funksiyasi multimapdagi elementlar sonini qaytaradi. Masalan,

example.cpp
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {

    unordered_multimap<string, int> my_unordered_multimap;
    
    // kiritishdan oldin quvvatni tekshiring
    string result = my_unordered_multimap.empty()? "Yes" : "No";
    int multimap_size =  my_unordered_multimap.size();

    cout << "Before Insertion";
    cout << "\nIs unordered_multimap empty? " << result << endl;
    cout << "unordered_multimap size: " << multimap_size << endl;
        
    // elementni kiritish
    my_unordered_multimap.insert({"apple",2});
    
    // o'rnatilgandan keyin quvvatni tekshiring
    result = my_unordered_multimap.empty()? "Yes" : "No";
    multimap_size = my_unordered_multimap.size();

    cout << "\nAfter Insertion" << endl;
    cout << "\Is unordered_multimap empty? " << result << endl;
    cout << "unordered_multimap size: " << multimap_size << endl;
    
    return 0;
}

Chiqish

kod
Before Insertion
Is unordered_multimap empty? Yes
unordered_multimap size: 0

After Insertion
Is unordered_multimap empty? No
unordered_multimap size: 1

Bu erda, ternary operator dan foydalanib, natija o'zgaruvchisi satrni saqlaydi

-Yes , agar multimap bo'sh bo'lsa (ya'ni, empty() true ni qaytarganda) -Yes , agar multimap bo'sh bo'lmasa (ya'ni, empty() false ni qaytarganda)

Tartibsiz multimapdan elementlarni o'chirish

Tartibsiz multimapdagi elementlarni oʻchirish uchun quyidagi funksiyalardan foydalanishimiz mumkin:

-erase() - multimapdan kalitning barcha nusxalarini o'chiradi -clear() - multimapdagi har bir elementni o'chiradi

example.cpp
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {

    unordered_multimap<string, int> my_unordered_multimap;

    my_unordered_multimap.insert({"apple", 5});
    my_unordered_multimap.insert({"banana", 3});
    my_unordered_multimap.insert({"apple", 2});
    my_unordered_multimap.insert({"cherry", 4});

    // "olma" tugmachasi bilan elementlarni o'chiring
    string key_to_erase = "apple";
    my_unordered_multimap.erase(key_to_erase);

    cout << "Elements after erasing key " << key_to_erase << ":" << endl;
    for (const auto& pair : my_unordered_multimap) {
        cout << pair.first << " -> " << pair.second << endl;
    }

    // butun unordered_multimapni tozalang
    my_unordered_multimap.clear();

    cout << "Elements after clearing:" << endl;
    for (const auto& pair : my_unordered_multimap) {
        cout << pair.first << " -> " << pair.second << endl;
    }

    return 0;
}

Chiqish

kod
Elements after erasing key apple:
cherry -> 4
banana -> 3
Elements after clearing: