62 / 90

C++ std::set

C++ std::set (Noyob to'plam)

To'plamlar STL containers bo'lib, ular bir xil turdagi noyob elementlarni tartiblangan holda saqlaydi.

To'plamdagi har bir elementning qiymati noyob bo'lganligi sababli, qiymatning o'zi elementni aniqlash uchun kalit bo'lib xizmat qiladi.

Xususiyatlar o'rnating

C++ to'plami quyidagi xususiyatlarga ega.

  1. Noyob elementlar

To'plamdagi ikkita element teng bo'lishi mumkin emas.

  1. O‘zgarmas

Biz to‘plamga elementlar qo‘shishimiz yoki olib tashlashimiz mumkin, lekin mavjud elementlarning qiymatlarini o‘zgartira olmaymiz.

  1. Saralangan tartib

To'plamdagi elementlar ma'lum bir qat'iy zaif tartib bo'yicha saralanadi.

Odatiy bo'lib, C++ to'plamlari o'sish tartibida tartiblangan, ammo bizda buni o'zgartirish imkoniyati mavjud.

  1. Assotsiativ

To‘plam elementlariga konteynerdagi joylashuvi bo‘yicha emas, balki kalit yordamida havola qilinadi.

Bu arrays dan farq qiladi, bu erda elementlarga indekslar yordamida kirish mumkin.

To'plam yaratish

C++ da to‘plamni amalga oshirish uchun dasturimizga <set> sarlavha faylini kiritishimiz kerak.

example.cpp
#include <set>

Biz C++ da quyidagi sintaksis yordamida to'plam yaratishimiz mumkin:

example.cpp
// to'plamini e'lon qiladi
std::set<data_type> set_name = {key1, key2, key3, ...};

Bu yerga,

  • std::set - declares an STL container of type set. -<data_type> - to'plamda saqlanadigan qiymatlarning data type . -set_name - to'plamga berilgan noyob nom. -key1, key2, key3, ... - to'plamda saqlanadigan kalit/qiymat.

Masalan,

example.cpp
// elementlar bilan to'plamni ishga tushirish
std::set<int> my_set1 = {5, 3, 8, 1, 3};

// bo'sh to'plam yarating
std::set<int> my_set2;

[!NOTE] Oldinga qarab, biz std namespace dan foydalanamiz, shuning uchun std:: ni sintaksisimizdan chiqarib tashlashimiz mumkin.

1-misol: To'plam yaratish

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

int main() {

    set<int> my_set = {5, 3, 8, 1, 3};
    
    for(int val : my_set) {
        cout << val << " ";
    }

    return 0;
}

Chiqish

kod
1 3 5 8

Bu erda biz int tipidagi to'plamni yaratdik.

Ko'rib turganingizdek, to'plam qiymatlarni tartiblangan tarzda qaytardi va 3 ning takroriy nusxasini e'tiborsiz qoldirdi.

[!NOTE] To‘plamga elementlar qo‘shish uchun [] operator dan foydalana olmaymiz. Bu xatoga olib keladi. // my_set [4] = 4 to'plamida bunga ruxsat berilmaydi

To'plamni kamayish tartibida tartiblang

To'plam elementlarini kamayish tartibida tartiblash uchun biz sintaksisimizni quyidagicha o'zgartirishimiz mumkin:

example.cpp
set<int, greater<int>> my_set;

Masalan,

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

int main() {

    set<int, greater<int>> my_set = {5, 3, 8, 1, 3};
    
    for(int val : my_set) {
        cout << val << " ";
    }

    return 0;
}

Chiqish

kod
8 5 3 1

Chiqishdan ko'rinib turibdiki, to'plam endi kamayish tartibida tartiblangan elementlarni qaytaradi.

C++ o'rnatish usullari

C++ tilida set klassi to'plamda turli operatsiyalarni bajarish uchun turli usullarni taqdim etadi.

Amaliyot tavsifi insert() Elementlarni to‘plamga joylashtiring. erase() To‘plamdan elementlarni o‘chirish. clear() To'plamdan barcha elementlarni olib tashlang. empty() To'plam bo'sh yoki yo'qligini tekshiring. size() To'plam hajmini qaytaradi.

2-misol: To‘plamga qiymat qo‘shish

example.cpp
#include <iostream>     
#include <set>          
using namespace std;
   
int main () {

    set<int> my_set;

    // to'plamga qiymatlarni qo'shing
    my_set.insert(10);
    my_set.insert(30);
    my_set.insert(20);
    my_set.insert(50);
    my_set.insert(40);
    my_set.insert(50);
    
    // to'plam elementlarini chop eting
    for (int i : my_set) {
        cout << i << "  ";
    }
    
    return 0;
}

Chiqish

kod
10  20  30  40  50

Bu erda biz int tipidagi bo'sh my_set to'plamini yaratdik va unga insert() usuli yordamida qiymatlarni qo'shdik.

E'tibor bering, takroriy qo'shimchalar olib tashlanadi va qo'shish tartibi boshqacha bo'lishiga qaramay, to'plam o'sish tartibida tartiblanadi.

3-misol: To'plamda element mavjudligini tekshiring

example.cpp
#include <iostream>     
#include <set>          
using namespace std;
   
int main () {

    set<int> my_set;

    // to'plamga qiymatlarni qo'shing
    my_set.insert(10);
    my_set.insert(30);
    my_set.insert(20);
    my_set.insert(50);
    my_set.insert(40);
    my_set.insert(50);
    
    // 40 mavjudligini tekshiring
    int num = 40;
    if(my_set.count(num) == 1) {
        cout << num << " exists." << endl;
    } else {
        cout << num << " doesn't exist." << endl;
    }
    
    // 60 mavjudligini tekshiring
    num = 60;
    if(my_set.count(num) == 1) {
        cout << num << " exists." << endl;
    } else {
        cout << num << " doesn't exist." << endl;
    }
    
    return 0;
}

Chiqish

kod
40 exists.
60 doesn't exist.

Bu erda biz int tipidagi bo'sh my_set to'plamini yaratdik va unga insert() usuli yordamida qiymatlarni qo'shdik.

my_set.count(num) tomonidan my_set to'plamida 40 va 60 soni 40 va 60 bo'lsa, biz tekshirdik.

my_set.count(num) returns 1 if num exists in my_set, otherwise it returns 0.

4-misol: To‘plamdan elementlarni o‘chirish

example.cpp
#include <iostream>     
#include <set>          
using namespace std;
   
int main () {

    set<int> my_set = {10, 20, 30, 40};
    
    // o'chirishdan oldin o'rnating
    cout << "The set before deletion: ";
    for (int i : my_set) {
        cout << i << "  ";
    }

    // to'plamdan qiymatlarni o'chirish
    my_set.erase(10);
    my_set.erase(20);
    
    // o'chirishdan keyin o'rnatiladi
    cout << "\nThe set after deletion: ";
    for (int i : my_set) {
        cout << i << "  ";
    }

    // to'plamdan barcha elementlarni o'chiring
    my_set.clear();

    // barcha elementlarni tozalashdan keyin o'rnating
    cout << "\nThe set after clearing all elements: ";
    for (int i : my_set) {
        cout << i << "  ";
    }
    
    return 0;
}

Chiqish

kod
The set before deletion: 10  20  30  40  
The set after deletion: 30  40
The set after clearing all elements:

Bu erda biz alohida to'plam elementlarini o'chirish uchun erase() usulidan foydalandik.

Keyin, biz to'plamning barcha elementlarini o'chirish uchun clear() usulidan foydalandik.

5-misol: C++ empty() va size() usullarini o‘rnating

C++ tilida empty() va size() usullari sig'im usullari deb ataladi.

empty() usuli qaytadi

  • 1 (to'g'ri) - agar to'plam bo'sh bo'lsa
  • 0 (noto'g'ri) - agar to'plam bo'sh bo'lmasa

Masalan,

example.cpp
#include <iostream>     
#include <set>          
using namespace std;
   
int main () {

    set<int> my_set = {10, 20, 30};

    // oldin o'rnating
    cout << "The set before clear: ";
    for (int i : my_set) {
        cout << i << "  ";
    }
    
    // to'plam bo'sh yoki yo'qligini tekshiring
    cout << "\nEmpty: " << my_set.empty() << endl;

    // to'plam hajmini tekshiring
    cout << "Size: " << my_set.size() << endl;
    
    // to'plamdan qiymatlarni aniqlang
    my_set.clear();
    
    // tozalagandan keyin o'rnating
    cout << "\nThe set after clear: ";
    for (int i : my_set) {
        cout << i << "  ";
    }
    
    // sig'im usullaridan yana foydalaning
    cout << "\nEmpty: " << my_set.empty() << endl;
    cout << "Size: " << my_set.size() << endl;

    return 0;
}

Chiqish

kod
The set before clear: 10  20  30  
Empty: 0
Size: 3

The set after clear: 
Empty: 1
Size: 0

Bu erda biz empty() va size() usullarini to'plam tarkibini tozalashdan oldin va keyin ishlatganmiz.

Tarkibni tozalashdan oldin:

-empty() 0 ni qaytaradi, bu to'plam bo'sh emasligini ko'rsatadi -size() 3 ni qaytaradi, bu to'plamda uchta element mavjudligini ko'rsatadi

Tarkibni tozalagandan so'ng:

-empty() 1ni qaytaradi, bu to'plam bo'sh ekanligini ko'rsatadi -size() 0 ni qaytaradi, bu to'plamda hech qanday element yo'qligini ko'rsatadi

Shuningdek oʻqing