63 / 90

C++ std::multimap

C++ std::multimap (Takroriy kalitlar)

C++ multimap standart andozalar kutubxonasidagi (STL) assotsiativ konteyner boʻlib, map funksiyasini taʼminlaydi, lekin bir nechta elementlarga ekvivalent kalitlarga ega boʻlishiga imkon beradi.

C++ std::multimap yarating

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

example.cpp
#include <map>

Ushbu faylni import qilgandan so'ng, biz quyidagi sintaksis yordamida multimap yaratishimiz mumkin:

example.cpp
std::multimap<key_type, value_type> multimap_name = {
    {key1, value1},
    {key2, value2},
    ...
};

Bu yerga,

-key_type - kalit uchun ma'lumotlar turi -value_type - qiymat uchun ma'lumotlar turi -{key1, value1}, {key2, value2}, ... - multimapga tayinlanadigan kalit-qiymat juftliklari

[!NOTE] Biz o‘quv qo‘llanmamizda std nom maydonidan foydalanamiz. Shunday qilib, std::multimap o'rniga multimap yozishimiz mumkin.

Masalan,

example.cpp
// int kaliti va satr qiymati bilan multimap yarating
multimap<int, string> my_multimap = {
    {1, "One"},
    {1, "Uno"},
    {2, "Two"},
};

Bu my_multimap nomli multimapni yaratadi, bu erda kalitlar int tipidagi va qiymatlar string tipidagi bo'ladi.

Misol: C++ Multimap

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

int main() {

    // multimap yaratish
    multimap<int, string> my_multimap = {
        {1, "Un"},
        {1, "One"},
        {2, "Two"},
        {2, "Dos"},
        {1, "Uno"},
        {2, "Deux"}
    };

    cout << "Key - Value" << endl;

    // multimap bo'ylab aylanish
    // kalit-qiymat juftlarini ko'rsatish
    for(const auto& key_value: my_multimap) {
        int key = key_value.first;
        string value = key_value.second;

        cout << key << " - " << value << endl;
  }

    return 0;
}

Chiqish

kod
Key - Value
1 - Un
1 - One
1 - Uno
2 - Two
2 - Dos
2 - Deux

Yuqoridagi misolda biz my_multimap nomli multimapni e'lon qildik va ishga tushirdik.

E'tibor bering, multimap qo'shish tartibi bo'yicha emas, balki kalitlari bo'yicha tartiblangan.

[!NOTE] Qo'shish tartibi faqat bir xil kalitlarga ega elementlar uchun saqlanadi.

Keyin, biz ranged for loop yordamida multimap tarkibini ko'rsatdik.

example.cpp
for(const auto& key_value: my_multimap) {
    int key = key_value.first;
    string value = key_value.second;    
    cout << key << " - " << value << endl;
}

Yuqoridagi kodda multimapning har bir elementi (kalit-qiymat juftligi) key_value o'zgaruvchisida saqlanadi.

Keyin biz kalit va qiymatni olamiz:

-key_value.first - kalitni beradi -key_value.second - qiymatni beradi

C++ Multimap usullari

C++ tilida multimap klassi multimapda turli operatsiyalarni bajarish uchun turli usullarni taqdim etadi.

Usullar tavsifi insert() bir yoki bir nechta kalit-qiymat juftlarini kiritadi count() belgilangan kalitning umumiy takrorlanish sonini qaytaradi find() iteratorni ko‘rsatilgan kalit bilan elementga qaytaradi size() elementlar sonini qaytaradi empty() agar multimap bo‘sh bo‘lsa, rost qaytaradi erase() XCO ko‘rsatilgan elementlarni D6 bilan olib tashlaydi.

Multimapga kiritish

insert() usuli yordamida multimapga kalit-qiymat juftligini kiritishimiz mumkin. Masalan,

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

int main() {

    multimap<string, int> numbers;

    // juftlik kiriting {"G'alati", 1}
    numbers.insert({"Odd", 1});

    // bir nechta juftlarni kiriting
    numbers.insert({{"Even", 2}, {"Even", 6}, {"Odd", 5}, {"Even", 4}});

    cout << "Key - Value" << endl;

    // raqamlarni ko'rsatish
    for(const auto& key_value: numbers) {
        string key = key_value.first;
        int value = key_value.second;
        cout << key << " - " << value << endl;
    }

    return 0;
}

Chiqish

kod
Key - Value
Even - 2
Even - 6
Even - 4
Odd - 1
Odd - 5

Multimapdan elementlarni olib tashlang

Multimapdan elementlarni olib tashlash uchun quyidagi usullardan foydalanishimiz mumkin:

-erase() - belgilangan kalit bilan elementni olib tashlang

  • clear() - remove all multimap elements

Masalan,

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

// display_multimap() funksiyasi prototipi
void display_multimap(const multimap<int, string> &);

int main() {

    multimap<int, string> student {
        {111, "John"},
        {132, "Mark"},
        {143, "Chris"},
        {143, "Christopher"}
    };
  
    cout << "Initial Multimap:" << endl;
    display_multimap(student);

    // Elementni kalit bilan olib tashlang: 143
    student.erase(143);
  
    cout << "\nMultimap After Erasing Key 143: " << endl;
    display_multimap(student);

    // barcha multimap elementlarini olib tashlang
    student.clear();

    cout << "\nMultimap After Clearing: " << endl;
    display_multimap(student);

    return 0;
}

// multimap elementlarini chop etish funksiyasi
void display_multimap(const multimap<int, string> &umap){

    for(const auto& key_value: umap) {
        int key = key_value.first;
        string value = key_value.second;
    
        cout << key << " - " << value << endl;
    }
}

Chiqish

kod
Initial Multimap:
111 - John
132 - Mark
143 - Chris
143 - Christopher

Multimap After Erasing Key 143: 
111 - John
132 - Mark

Multimap After Clearing:

Yuqoridagi misolda biz multimapdan 143 kaliti bilan elementlarni olib tashlash uchun erase() usulidan foydalandik.

Keyin, biz multimapning barcha elementlarini olib tashlash uchun clear() usulidan foydalandik.

Multimap hajmini tekshiring

Biz empty() usuli yordamida multimapning bo'shligini tekshirishimiz va size() usuli yordamida uning hajmini hisoblashimiz mumkin.

empty() usuli qaytadi

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

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

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

int main() {

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

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

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

Chiqish

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

After Insertion
Is multimap empty? No
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)

Multimapda kalitni toping

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

find() funksiyasi qaytadi

  • kalit topilsa, elementga iterator
  • kalit topilmasa, konteyner oxirigacha iterator ( end() iterator).

Masalan,

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

int main() {

    multimap<string, int> my_multimap;

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

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

    // topilgan kalitni chop eting
    if (found != my_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() usuli multimapdagi kalitning faqat birinchi nusxasini qaytaradi.

Multimapda kalit mavjudligini tekshiring

Belgilangan kalit multimapda mavjudligini tekshirish uchun quyidagi usullardan foydalanishimiz mumkin.

-find() - agar kalit topilsa, elementga iteratorni qaytaradi, aks holda end() iteratorini qaytaradi

  • count() - returns total number of occurrences of specified key

Masalan,

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

int main() {

    multimap<int, string> students {
        {20, "Chris"},
        {28, "Joseph"},
        {20, "Blake"}
    };

    cout << "Using count():" << endl;
    cout << "Does age " << 20 << " exist? ";

    // count() belgilangan kalitning takrorlanish sonini qaytaradi
    int count_20 = students.count(20);

    if (count_20) {
        cout << "Yes";
        cout << "\nTotal Students with age 20 = " << count_20 << endl;
    }
    else {
        cout << "No";
    }

    cout << "\nUsing find():" << endl;
    cout << "Does age " << 27 << " exist? ";

    // find() student.end() ni qaytaradi
    // agar kalit topilmasa
    if (students.find(27) != students.end()) {
        cout << "Yes";
    }
    else {
        cout << "No";
    }
  
    return 0;
}

Chiqish

kod
Using count():
Does age 20 exist? Yes
Total Students with age 20 = 2

Using find():
Does age 27 exist? No

Yuqoridagi misolda biz multimapda berilgan kalit mavjudligini tekshirish uchun find() va count() usullaridan foydalanganmiz.

Dastlab, biz count() usulidan foydalanib, kalit 20 paydo bo'lishining umumiy sonini topdik.

example.cpp
int count_20 = students.count(20);

Keyin, biz kalit 27 mavjudligini tekshirish uchun find() usulidan foydalandik.

example.cpp
if (students.find(27) != students.end()) {
    cout << "Yes";
}
else {
    cout << "No";
}