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.
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.
C++ da multisetni amalga oshirish uchun dasturimizga <set> sarlavha faylini kiritishimiz kerak.
#include <set>
Biz C++ da quyidagi sintaksis yordamida multiset yaratishimiz mumkin:
// 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,
// 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
stdnom maydonidan foydalanamiz, shuning uchunstd::ni sintaksisimizdan chiqarib tashlashimiz mumkin.
#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
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.
Ko'p to'plam elementlarini kamayish tartibida olish uchun biz sintaksisimizni quyidagicha o'zgartirishimiz mumkin:
multiset<int, greater<int>> my_multiset ;
Masalan,
#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
8 5 3 3 1
Chiqishdan ko'rinib turibdiki, multiset endi elementlarni kamayish tartibida qaytaradi.
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.
#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
10 20 30 40 50 50
Ko'rib turganingizdek, multisetdagi insert() sets bilan bir xil.
#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
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.
// multisetdan barcha qiymatlarni o'chiring
my_multiset.erase(50);
Bizning holatlarimizda, 50 ning ikkala nusxasi ham my_multiset dan o'chirildi.
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
Masalan,
#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
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.