64 / 90

C++ std::multiset

C++ std::multiset (Takroriy to'plam)

C++ multisetlari bir xil turdagi elementlarni tartiblangan tartibda saqlaydigan STL konteynerlari bo‘lib, bir nechta elementlar ekvivalent qiymatlarga ega bo‘lishi mumkin. Boshqacha qilib aytganda, takroriy qiymatlarga ruxsat beriladi.

C++ to'plamlari singari, har bir elementning qiymati o'z kaliti sifatida ishlaydi.

Ko'p to'plam xususiyatlari

C++ multisetlari quyidagi xususiyatlarga ega:

Assotsiativ: Elementlar konteynerdagi mutlaq joylashuvi bilan emas, balki kalitlari bilan havola qilinadi.

Saralangan: Elementlar tartiblangan tarzda saqlanadi.

Ekvivalent kalitlar: konteynerdagi bir nechta elementlar ekvivalent kalitlarga ega bo'lishi mumkin.

O'zgarmas: elementlarning qiymatini multisetda saqlanganidan keyin o'zgartirib bo'lmaydi.

Multiset yarating

C++ da multisetni amalga oshirish uchun dasturimizga <set> sarlavha faylini kiritishimiz kerak.

example.cpp
#include <set>

Biz C++ da quyidagi sintaksis yordamida multiset yaratishimiz mumkin:

example.cpp
// multito'plamni e'lon qiling
std::multiset<data_type> multiset_name = {key1, key2, key3, ...};

Bu yerga,

  • std::multiset - declares an STL container of type multiset. -<data_type> - multisetda saqlanadigan qiymatlarning ma'lumotlar turi. -multiset_name - multisetga berilgan noyob nom. -key1, key2, key3, ... - multisetda saqlanadigan kalit/qiymat.

Masalan,

example.cpp
// elementlar bilan multisetni ishga tushirish
std::multiset<int> my_multiset1 = {5, 3, 8, 1, 3};

// bo'sh multiset yarating
std::multiset<int> my_multiset2;

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

1-misol: Multiset yaratish

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

int main() {

    multiset<int> my_multiset = {5, 3, 8, 1, 3};
    
    for(int val : my_multiset) {
        cout << val << " ";
    }
    
    return 0;
}

Chiqish

kod
1 3 3 5 8

Bu erda biz int tipidagi multisetni yaratdik.

Ko'rib turganingizdek, multiset qiymatlarni tartiblangan tarzda qaytardi va 3 ning takroriy nusxalarini o'z ichiga oladi.

Multisetni kamayish tartibida tartiblang

Ko'p to'plam elementlarini kamayish tartibida olish uchun biz sintaksisimizni quyidagicha o'zgartirishimiz mumkin:

example.cpp
multiset<int, greater<int>> my_multiset ;

Masalan,

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

int main() {

    multiset<int, greater<int>> my_multiset = {5, 3, 8, 1, 3};
    
    for(int val : my_multiset) {
        cout << val << " ";
    }
    
    return 0;
}

Chiqish

kod
8 5 3 3 1

Chiqishdan ko'rinib turibdiki, multiset endi elementlarni kamayish tartibida qaytaradi.

C++ Multiset usullari

C++ da bizda multisetda turli operatsiyalarni bajarish uchun turli usullar mavjud.

Amaliyot tavsifi insert() Elementlarni multisetga joylashtiring. erase() Elementning barcha nusxalarini o'chirish. clear() Multisetdan barcha elementlarni olib tashlang. empty() Multiset bo'sh yoki yo'qligini tekshiring. size() Multisetning hajmini qaytaradi.

2-misol: Multisetga elementlar qo'shish

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

    multiset<int> my_multiset;
    
    // multisetga qiymat qo'shing
    my_multiset.insert(10);
    my_multiset.insert(30);
    my_multiset.insert(20);
    my_multiset.insert(50);
    my_multiset.insert(40);
    my_multiset.insert(50);

    // kiritilgandan keyin multisetni chop eting
    for (int i : my_multiset) {
        cout << i << "  ";
    }
    
    return 0;
}

Chiqish

kod
10  20  30  40  50  50

Ko'rib turganingizdek, multisetdagi insert() sets bilan bir xil.

3-misol: Multisetdan elementlarni olib tashlash

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

    multiset<int> my_multiset = {10, 30, 20, 50, 40, 50};

    // multisetdan 50 ning barcha holatlarini o'chirib tashlang
    my_multiset.erase(50);
    
    // o'chirishdan keyin multisetni chop eting
    cout << "\nThe multiset after erase: ";
    for (int i : my_multiset) {
        cout << i << "  ";
    }
    
    // multisetdan barcha qiymatlarni o'chiring
    my_multiset.clear();
    
    // tozalashdan keyin multisetni chop eting
    cout << "\nThe multiset after clear: ";
    for (int i : my_multiset) {
        cout << i << "  ";
    }
    
    return 0;
}

Chiqish

kod
The multiset after erase: 10  20  30  40  
The multiset after clear:

Ko'rib turganingizdek, clear() to'plamdagi kabi multisetda ham ishlaydi va barcha qiymatlarni o'chiradi.

Boshqa tomondan, erase() usuli berilgan qiymatning har bir nusxasini multisetdan o'chiradi.

example.cpp
// multisetdan barcha qiymatlarni o'chiring
my_multiset.erase(50);

Bizning holatlarimizda, 50 ning ikkala nusxasi ham my_multiset dan o'chirildi.

4-misol: C++ Multiset empty() va size() usullari

Biz empty() va size() sig'im usullaridan multisets bilan uning bo'sh yoki yo'qligini tekshirishimiz va mos ravishda hajmini olishimiz mumkin.

empty() usuli qaytadi

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

Masalan,

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

    multiset<int> my_multiset = {10, 20, 20, 20 ,30 , 40};

    // barcha qiymatlarni tozalashdan oldin multisetni chop eting
    cout << "The multiset before clear: ";
    for (int i : my_multiset) {
        cout << i << "  ";
    }
    
    // multiset bo'sh yoki yo'qligini tekshiring
    cout << "\nEmpty: " << my_multiset.empty() << endl;

    // multiset hajmini tekshiring
    cout << "Size: " << my_multiset.size() << endl;
    
    // multisetdan barcha qiymatlarni o'chiring
    my_multiset.clear();
    
    // tozalashdan keyin multiset
    cout << "\nThe multiset after clear: ";
    for (int i : my_multiset) {
        cout << i << "  ";
    }
    
    // sig'im usullaridan yana foydalaning
    cout << "\nEmpty: " << my_multiset.empty() << endl;
    cout << "Size: " << my_multiset.size() << endl;

    return 0;
}

Chiqish

kod
The multiset before clear: 10  20  20  20  30  40  
Empty: 0
Size: 6

The multiset after clear: 
Empty: 1
Size: 0

Bu erda biz multiset tarkibini tozalashdan oldin va keyin empty() va size() usullaridan foydalanganmiz.

Tarkibni tozalashdan oldin:

-empty() 0 ni qaytaradi, bu multiset bo'sh emasligini ko'rsatadi. -size() 6 ni qaytaradi, bu multisetda oltita element mavjudligini ko'rsatadi.

Tarkibni tozalagandan so'ng:

-empty() 1ni qaytaradi, bu multiset bo'sh ekanligini ko'rsatadi. -size() 0 ni qaytaradi, bu multisetda hech qanday element yo'qligini ko'rsatadi.