C++ std::map (Kalit-qiymat xaritasi)
C++ tilida xaritalar juft maʼlumotlarni saqlaydigan bogʻlangan konteynerlardir.
Kalit-qiymat juftliklari deb nomlanuvchi bu juftliklar noyob kalitga ega, shu bilan birga bog'langan qiymatlar yagona bo'lishi shart emas.
A map named student

Xaritadagi elementlar kalitlari bo'yicha ichki tartiblangan.
C++ da xaritalardan foydalanish uchun dasturimizga map sarlavha faylini kiritishimiz kerak:
#include <map>
Biz xaritani quyidagi sintaksis yordamida e'lon qilishimiz mumkin:
std::map<key_type, value_type> map_name = {{key1, value1},{key2, value2}, ...};
Bu yerga,
std::map - declares an STL container of type map
-<key_type> - xaritada saqlanadigan kalitlarning ma'lumotlar turi
-<value_type> - xaritada saqlanadigan qiymatlarning ma'lumotlar turi
-map_name - xaritaga berilgan noyob nom
-key1, key2, ... - xaritada saqlanadigan kalitlar
-value1, value2, ... - xaritada saqlanadigan qiymatlarKeling, bir misolni ko'rib chiqaylik,
// butun sonli kalitlar va satr qiymatlari bilan xarita yarating
std::map<int, string> student = {{1,"Jacqueline"}, {2,"Blake"}, {3,"Denise"}};
[!NOTE]
=tayinlash operatoridan foydalanmasdan ham xarita elementlarini ishga tushirishimiz mumkin. Masalan,std::map<int, string> student {{1,"Jacqueline"}, {2,"Blake"}, {3,"Denise"}};
C++ tilida map class xaritada turli operatsiyalarni bajarish uchun turli usullarni taqdim etadi.
Amaliyot tavsifi insert() xaritaga element (kalit-qiymat juftligi) qo‘shadi erase() xaritadan element yoki elementlar oralig‘ini olib tashlaydi clear() xaritadan barcha elementlarni olib tashlaydi find() berilgan kalitni xaritadan qidiradi size() xaritadagi elementlar sonini qaytaradi empty() , agar xarita bo‘sh bo‘lsa, true ni qaytaradi
Xaritaga kalit-qiymat juftlarini qo'shish uchun [] operatoridan foydalanishimiz mumkin. Masalan,
// butun sonli kalitlar va satr qiymatlari bilan xarita yarating
std::map<int, string> student;
// 1-kalitli element va "Jacqueline" qiymatini qo'shing
student[1] = "Jacqueline";
// 2-kalit va "Bleyk" qiymatiga ega elementni qo'shing
student[2] = "Blake";
Xaritaga elementlarni kiritish uchun make_pair() funksiyasi bilan bir qatorda insert() funksiyasidan ham foydalanishimiz mumkin. Masalan,
student.insert(std::make_pair(3, "Denise"));
Yuqoridagi ikkita usulni quyidagi sintaksislarga umumlashtirishimiz mumkin:
// [] operatori yordamida
map_name[key] = value;
// insert() va make_pair() funksiyalaridan foydalanish
map_name.insert(std::make_pair(key, value));
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> student;
// elementlarni qo'shish uchun [] operatoridan foydalaning
student[1] = "Jacqueline";
student[2] = "Blake";
// elementlarni qo'shish uchun insert() usulidan foydalaning
student.insert(make_pair(3, "Denise"));
student.insert(make_pair(4, "Blake"));
// ikki nusxadagi kalitlarga ega elementlarni qo'shing
student[5] = "Timothy";
student[5] = "Aaron";
for (int i = 1; i <= student.size(); ++i) {
cout << "Student[" << i << "]: " << student[i] << endl;
}
return 0;
}
Chiqish
Student[1]: Jacqueline
Student[2]: Blake
Student[3]: Denise
Student[4]: Blake
Student[5]: Aaron
Ushbu dasturda biz int kalitlari va string qiymatlarini saqlaydigan talaba nomli xaritani yaratdik.
E'tibor bering, bizning dasturimizda ikkita takroriy qiymat ( "Blake" ) mavjud, bu amal qiladi.
Biroq, bizning dasturimizda ikkita dublikat kalit (5) mavjud, bu yaroqsiz.
Bu erda, "Timothy" va "Aaron" ikkalasi ham bir xil kalitga ega bo'lganligi sababli, qiymatlardan faqat bittasini saqlashga ruxsat beriladi.
Birinchidan, "Timothy" talabadagi 5 kaliti bilan bog'langan. Keyin, "Aaron" 5 bilan bog'langanda, "Timothy" ustiga yoziladi.
Keyin barcha xarita elementlarini chop etish uchun for loop dan foydalanamiz.
[!NOTE] Xarita elementini to'g'ridan-to'g'ri chop etish uchun
coutdan foydalansak, biz uning kalitini emas, balki faqat mos keladigan xarita qiymatini chop etamiz.// Natija: Jacqueline cout << student[1];
Biz xaritamizning kalitlari va qiymatlariga iterators xaritasi yordamida kira olamiz. Masalan,
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> student;
student[1] = "Jacqueline";
student[2] = "Blake";
student[3] = "Denise";
student[4] = "Aaron";
// xarita iteratorini e'lon qilish
map<int, string>::iterator iter;
// xarita elementlarini ko'rsatish uchun iteratordan foydalaning
for (iter = student.begin(); iter != student.end(); ++iter) {
cout << iter->first << " - " << iter->second << endl;
}
return 0;
}
Chiqish
1 - Jacqueline
2 - Blake
3 - Denise
4 - Aaron
Yuqoridagi misolda biz talaba xaritasining kalitlari va qiymatlariga kirish uchun maxsus iterator iteridan foydalanganmiz. Kalit first obyekti tomonidan, qiymat esa second obyekti tomonidan beriladi.
E'tibor bering, biz talabaning barcha elementlarini ko'rsatish uchun iter iterator bilan for siklidan foydalanganmiz.
for (iter = student.begin(); iter != student.end(); ++iter) {
cout << iter->first << " - " << iter->second << endl;
}
Bu yerga,
-begin() - xaritaning birinchi elementiga ishora qiluvchi iteratorni qaytaradi
-end() - xaritaning oxirgi elementidan keyingi nazariy elementga ishora qiluvchi iteratorni qaytaradi
Biz first va second obyektlariga kirish uchun iter bilan -> operatoridan foydalandik.
Shu bilan bir qatorda, biz iterni bekor qilishimiz va first va second obyektlariga kirish uchun . operatoridan foydalanishimiz mumkin.
// Chiqish: 1
cout << (*iter).first << " - ";
// Chiqish: Jaklin
cout << (*iter).second;
[!NOTE]
*operatori xarita elementlariga to'g'ridan-to'g'ri kirish uchun iteratorlarga murojaat qiladi. Batafsil ma'lumot olish uchun C++ Pointers ga tashrif buyuring.
find() funksiyasidan foydalanib, xaritada kalitlarni qidirishimiz mumkin. Uning sintaksisi
map_name.find(key);
Masalan,
map<int, string> student;
map<int, string>::iterator iter;
student[1] = "Jacqueline";
student[2] = "Blake";
// talaba xaritasida kalit 2 ni toping
// qaytarilgan qiymatni iterda saqlang
iter = student.find(2);
Yuqoridagi misolda biz 2-kalitni o'z ichiga olgan talaba elementini qidirish uchun find() funksiyasidan foydalanganmiz.
Endi find() funksiyasi qaytaradi:
student.end() .[!NOTE] Qo'shimcha ma'lumot olish uchun C++ functions ga tashrif buyuring.
erase() va clear() funksiyalari bilan xarita elementlarini o‘chirib tashlashimiz mumkin.
Avval clear() funksiyasi haqida gapiraylik.
clear() funksiyasi xaritaning barcha elementlarini o'chiradi. Masalan,
map<int, string> student;
student[1] = "Jacqueline";
student[2] = "Blake";
cout << student.size(); // Chiqish: 2
student.clear();
cout << student.size(); // Chiqish: 0
erase() funksiyasidan alohida elementlarni iteratorlar yoki tugmalar yordamida oʻchirish uchun foydalanishimiz mumkin.
Faraz qilaylik, bizda student_rank nomli xarita bor:
map <string, int> student_rank {{"Josh", 2}, {"Rachel", 4}, {"Betty", 6}};
Endi biz ushbu xaritaning elementlarini quyidagi usullar bilan o'chirib tashlashimiz mumkin:
// xaritadan "Reychel" tugmasi bilan elementni o'chirish
student_rank.erase("Rachel");
// xaritaning boshiga ishora qiluvchi iteratorni ishga tushiring
map <string, int>::iterator itr = student_rank.begin();
// ikkinchi elementga ishora qilish uchun iteratorni oshiring
itr++;
// ikkinchi elementni o'chiring
student_rank.erase(itr);
#include <iostream>
#include <map>
using namespace std;
int main() {
// talaba nomli xarita yarating
map <int, string> student {{1, "Denise"}, {2, "Blake"}, {3, "Courtney"}, {4, "John"}, {5, "Jennifer"}};
// xarita iteratorini yarating
map <int, string>::iterator itr;
// dastlabki xarita qiymatlarini ko'rsatish
cout << "Initial Values:" << endl;
for(itr = student.begin(); itr != student.end(); ++itr) {
cout << itr->second << ", ";
}
cout << endl;
// Birinchi xarita elementiga ishora qilish uchun itr iteratoridan foydalaning
itr = student.begin();
// birinchi elementni olib tashlang
student.erase(itr);
// 4-kalitga ega elementni olib tashlang
student.erase(4);
// Yakuniy xarita qiymatlarini ko'rsatish
cout << "\nFinal Values:" << endl;
for(itr = student.begin(); itr != student.end(); ++itr) {
cout << itr->second << ", ";
}
return 0;
}
Chiqish
Initial Values:
Denise, Blake, Courtney, John, Jennifer,
Final Values:
Blake, Courtney, Jennifer,
Yuqoridagi dasturda biz alohida xarita elementlarini o'chirish uchun erase() funksiyasidan foydalanganmiz.
Birinchidan, biz erase() ga itr iteratorini etkazib, birinchi xarita elementini o'chirdik.
itr = student.begin();
student.erase(itr);
[!NOTE] Xaritada aylanish uchun itr iteratoridan ham foydalandik.
Keyin, kalitni erase() ga etkazib berish orqali 4 kalitiga ega bo'lgan xarita elementini o'chirib tashladik.
student.erase(4);
Remove Individual Map Elements

erase() funksiyasidan bir qator elementlarni xaritadan olib tashlash uchun ham foydalanish mumkin. Buning uchun erase() funksiyasiga ikkita iteratorni o'tkazishimiz kerak:
my_map.erase(itr_first, itr_last);
Bu yerga,
Bu erda itr_first inklyuziv, ya'ni o'chiriladi, itr_last esa inklyuziv emas, ya'ni olib tashlanmaydi. Shubhasiz, ular orasidagi barcha elementlar ham olib tashlanadi.
Xaritadagi elementlar kaliti bo'yicha ichki tartiblanganligini unutmang.
#include <iostream>
#include <map>
using namespace std;
int main() {
// talaba nomli xarita yarating
map <int, string> student {{1, "Denise"}, {2, "Blake"}, {3, "Courtney"}, {4, "John"}, {5, "Jennifer"}};
// xarita iteratorini yarating
map <int, string>::iterator iter;
// dastlabki xarita qiymatlarini ko'rsatish
cout << "Initial Values:" << endl;
for(iter = student.begin(); iter != student.end(); ++iter) {
cout << iter->second << ", ";
}
cout << endl;
// bir qator elementlarni olib tashlang
student.erase(student.find(2),student.find(5));
// Yakuniy xarita qiymatlarini ko'rsatish
cout << "\nFinal Values:" << endl;
for(iter = student.begin(); iter != student.end(); ++iter) {
cout << iter->second << ", ";
}
return 0;
}
Chiqish
Initial Values:
Denise, Blake, Courtney, John, Jennifer,
Final Values:
Denise, Jennifer,
Yuqoridagi dasturda biz 2 va 5 tugmachalari orasidagi xarita elementlarini olib tashladik.
Biroq, 5-kalitli element o'chirilmaganiga e'tibor bering, 2-kalitli element esa o'chiriladi.
Buning sababi, erase() berilgan diapazonning boshlang'ich elementini olib tashlaydi, lekin oxirgi elementni olib tashlamaydi.
Remove a Range of Map Elements

Shuningdek o'qing: