61 / 90

C++ std::map

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

A map named student with integer-type keys and string-type values

Xaritadagi elementlar kalitlari bo'yicha ichki tartiblangan.

C++ da xaritalardan foydalanish uchun dasturimizga map sarlavha faylini kiritishimiz kerak:

example.cpp
#include <map>

Xarita yaratish

Biz xaritani quyidagi sintaksis yordamida e'lon qilishimiz mumkin:

example.cpp
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 qiymatlar

Keling, bir misolni ko'rib chiqaylik,

example.cpp
// 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"}};

Xarita usullari

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

Xaritadagi qiymatlarni qo'shish

Xaritaga kalit-qiymat juftlarini qo'shish uchun [] operatoridan foydalanishimiz mumkin. Masalan,

example.cpp
// 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,

example.cpp
student.insert(std::make_pair(3, "Denise"));

Yuqoridagi ikkita usulni quyidagi sintaksislarga umumlashtirishimiz mumkin:

example.cpp
// [] operatori yordamida
map_name[key] = value;

// insert() va make_pair() funksiyalaridan foydalanish
map_name.insert(std::make_pair(key, value));

1-misol: C++ xaritalari

example.cpp
#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

kod
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 cout dan foydalansak, biz uning kalitini emas, balki faqat mos keladigan xarita qiymatini chop etamiz. // Natija: Jacqueline cout << student[1];

Kirish kalitlari va qiymatlari

Biz xaritamizning kalitlari va qiymatlariga iterators xaritasi yordamida kira olamiz. Masalan,

example.cpp
#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

kod
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.

example.cpp
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.

example.cpp
// 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.

Xaritalar uchun C++ find() funksiyasi

find() funksiyasidan foydalanib, xaritada kalitlarni qidirishimiz mumkin. Uning sintaksisi

example.cpp
map_name.find(key);

Masalan,

example.cpp
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:

  • element mavjud bo'lsa, elementga ishora qiluvchi iterator
  • xaritaning oxiriga ishora qiluvchi iterator, ya'ni element mavjud bo'lmasa, student.end() .

[!NOTE] Qo'shimcha ma'lumot olish uchun C++ functions ga tashrif buyuring.

C++ Maps dan elementlarni oʻchirish

erase() va clear() funksiyalari bilan xarita elementlarini o‘chirib tashlashimiz mumkin.

Avval clear() funksiyasi haqida gapiraylik.

Xaritalar uchun C++ clear() funksiyasi

clear() funksiyasi xaritaning barcha elementlarini o'chiradi. Masalan,

example.cpp
map<int, string> student;
student[1] = "Jacqueline";
student[2] = "Blake";

cout << student.size();    // Chiqish: 2

student.clear();

cout << student.size();    // Chiqish: 0

Xaritalar uchun C++ erase() funksiyasi

erase() funksiyasidan alohida elementlarni iteratorlar yoki tugmalar yordamida oʻchirish uchun foydalanishimiz mumkin.

Faraz qilaylik, bizda student_rank nomli xarita bor:

example.cpp
map <string, int> student_rank {{"Josh", 2}, {"Rachel", 4}, {"Betty", 6}};

Endi biz ushbu xaritaning elementlarini quyidagi usullar bilan o'chirib tashlashimiz mumkin:

  1. Kalit yordamida erase().
example.cpp
// xaritadan "Reychel" tugmasi bilan elementni o'chirish
student_rank.erase("Rachel");
  1. erase() iterator yordamida
example.cpp
// 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);

2-misol: alohida elementlarni olib tashlash uchun erase()

example.cpp
#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

kod
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.

example.cpp
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.

example.cpp
student.erase(4);

Remove Individual Map Elements

The erase() function can remove individual elements with an iterator or a key

Elementlar diapazonini o'chirish

erase() funksiyasidan bir qator elementlarni xaritadan olib tashlash uchun ham foydalanish mumkin. Buning uchun erase() funksiyasiga ikkita iteratorni o'tkazishimiz kerak:

example.cpp
my_map.erase(itr_first, itr_last);

Bu yerga,

  • itr_first - o'chirish uchun birinchi elementga iterator
  • itr_last - o'chirish uchun oxirgi elementdan keyingi elementga iterator

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.

3-misol: Elementlar oralig'ini o'chirish uchun erase().

example.cpp
#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

kod
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

The erase() function can remove a range of map elements with an iterator or a key

Shuningdek o'qing: