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++ da multimap yaratish uchun avval <map> sarlavha faylini kiritishimiz kerak.
#include <map>
Ushbu faylni import qilgandan so'ng, biz quyidagi sintaksis yordamida multimap yaratishimiz mumkin:
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
stdnom maydonidan foydalanamiz. Shunday qilib,std::multimapo'rnigamultimapyozishimiz mumkin.
Masalan,
// 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.
#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
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.
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++ 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.
insert() usuli yordamida multimapga kalit-qiymat juftligini kiritishimiz mumkin. Masalan,
#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
Key - Value
Even - 2
Even - 6
Even - 4
Odd - 1
Odd - 5
Multimapdan elementlarni olib tashlash uchun quyidagi usullardan foydalanishimiz mumkin:
-erase() - belgilangan kalit bilan elementni olib tashlang
clear() - remove all multimap elementsMasalan,
#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
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.
Biz empty() usuli yordamida multimapning bo'shligini tekshirishimiz va size() usuli yordamida uning hajmini hisoblashimiz mumkin.
empty() usuli qaytadi
Va size() usuli multimapdagi elementlar sonini qaytaradi. Masalan,
#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
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)
Muayyan kalitga ega elementlarni topish uchun find() funksiyasidan foydalanishimiz mumkin.
find() funksiyasi qaytadi
end() iterator).Masalan,
#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
Found key apple:
apple - 5
Misoldan ko'rinib turibdiki, find() usuli multimapdagi kalitning faqat birinchi nusxasini qaytaradi.
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 keyMasalan,
#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
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.
int count_20 = students.count(20);
Keyin, biz kalit 27 mavjudligini tekshirish uchun find() usulidan foydalandik.
if (students.find(27) != students.end()) {
cout << "Yes";
}
else {
cout << "No";
}