C++ std::unordered_set (Hash to'plam)
STL unordered_set unordered associative container bo'lib, tartibsiz to'plam ma'lumotlar strukturasining funksionalligini ta'minlaydi.
Oddiy to'plamdan farqli o'laroq, tartibsiz to'plamdagi qiymatlar tartibi aniqlanmagan.
Shuningdek, tartibsiz to'plam hash table ma'lumotlar strukturasi sifatida amalga oshiriladi, oddiy to'plam esa binary search tree ma'lumotlar tuzilmasi sifatida amalga oshiriladi.
C++ da tartibsiz to‘plam yaratish uchun avval unordered_set sarlavha faylini kiritishimiz kerak.
#include <unordered_set>
Ushbu faylni import qilgandan so'ng, biz quyidagi sintaksis yordamida tartibsiz to'plam yaratishimiz mumkin:
unordered_set<data_type> ust;
Bu erda data_type tartibsiz to'plam qiymatlari uchun ma'lumotlar turini ko'rsatadi.
Masalan,
// tartibsiz butun sonlar to'plamini yarating
unordered_set<int> ust_integer;
// satrlarning tartibsiz_to'plamini yarating
unordered_set<string> ust_string;
Biz C++ tartibsiz to'plamini quyidagi usullar bilan ishga tushirishimiz mumkin:
// Initializer ro' ext
unordered_set<int> unordered_set1 = {1, 100, 2, 9};
// Yagona ishga tushirish
unordered_set<int> unordered_set2 {1, 100, 2, 9};
Bu erda biz tartibsiz to'plamni ularga bevosita qiymatlar berish orqali ishga tushirdik.
Endi unordered_set1 va unordered_set2 {1, 100, 2, 9} bilan ishga tushirildi.
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
// yagona ishga tushirish
unordered_set<int> numbers {1, 100, 10, 70, 100};
// tartibsiz to'plam bo'ylab sikl
// qiymatini ko'rsatish
cout << "numbers = ";
for(auto &num: numbers) {
cout << num << ", ";
}
return 0;
}
Chiqish
numbers = 70, 10, 100, 1,
Yuqoridagi misolda biz tartibsiz nomli raqamlar to'plamini bir xil ishga tushirishdan foydalangan holda e'lon qildik va ishga tushirdik.
unordered_set<int> numbers {1, 100, 10, 70, 100};
Keyin, biz ranged for loop yordamida tartibsiz to'plamning mazmunini ko'rsatdik.
for(auto &num: numbers) {
cout << num << ", ";
}
Bu yerda biz tartibsiz toʻplamni 1, 100, 10, 70, 100 tartibida ishga tushirdik. Eʼtibor bering, bizda takroriy qiymat 100 bor.
Lekin chiqishda biz faqat aniq raqamlarni hech qanday tartibda (ko'tarilish, pasayish, kiritish) olamiz.
// chiqish raqamlari
70, 10, 100, 1,
C++ unordered_set ni ishga tushirishning boshqa usullari Biz diapazonni ishga tushirish usuli yordamida tartibsiz to'plamni boshqasiga nusxalashimiz mumkin. unordered_set<string> unordered_set1 {"One", "Two", "Three"}; unordered_set<string> unordered_set2(unordered_set_1.begin(), unordered_set_1.end()); Bu yerda biz birinchi navbatda unordered_set1 nomli tartibsiz to'plamni yaratdik. Keyin, unordered_set1 ning barcha elementlarini nusxalash orqali unordered_set2 deb nomlangan yana bir tartibsiz to'plam yaratdik.
C++ tilida unordered_set klassi tartibsiz to'plamda turli operatsiyalarni bajarish uchun turli usullarni taqdim etadi.
Usullar tavsifi insert() tartibsiz to‘plamga element kiritadi, agar belgilangan qiymat mavjud bo‘lsa, count() 1 ni, agar u bo‘lmasa, 0 ni qaytaradi find() iteratorni belgilangan qiymatga ega elementga qaytaradi size() noyob elementlar sonini qaytaradi empty() , tartibsiz to‘plam XDECO6 elementi bo‘sh bo‘lsa, empty() true ni qaytaradi. barcha elementlarni olib tashlaydi
insert() usuli yordamida tartibsiz to'plamga element kiritishimiz mumkin. Masalan,
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<string> countries;
// mamlakatlarga "Nepal" ni kiritadi
countries.insert("Nepal");
// mamlakatlarga "Nepal", "Hindiston", "AQSh", "Koreya" ni kiritadi
countries.insert({"Nepal", "India", "USA", "Korea"});
cout << "Countries = ";
// mamlakatlar elementlarini ko'rsatish
for(const auto& country: countries) {
cout << country << ", ";
}
return 0;
}
Chiqish
Countries = Korea, USA, India, Nepal,
Yuqoridagi misolda biz satrlarni saqlash uchun bo'sh tartibsiz to'plamni ishga tushirdik.
Keyin, biz "Nepal" elementini qo'shdik:
countries.insert("Nepal");
Keyin biz bir nechta elementlarni qo'shdik:
countries.insert({"Nepal", "India", "USA", "Korea"});
erase() usuli yordamida tartibsiz to'plamning belgilangan qiymatiga ega elementni olib tashlashimiz mumkin. Masalan,
#include <iostream>
#include <unordered_set>
using namespace std;
// display_unordered_set() funksiyasi prototipi
void display_unordered_set(const unordered_set<string> &);
int main() {
unordered_set<string> languages {"C++", "Python", "Java", "PHP"};
cout << "Initial unordered set:\n";
display_unordered_set(languages);
// qiymati bo'lgan elementni olib tashlang: "Python"
languages.erase("Python");
cout << "\n\nFinal unordered set: \n";
display_unordered_set(languages);
return 0;
}
// unordered_set elementlarini chop etish uchun yordamchi dastur
void display_unordered_set(const unordered_set<string> &uset) {
for(const auto& value: uset) {
cout << value << ", ";
}
}
Chiqish
Initial unordered set:
PHP, Java, Python, C++,
Final unordered set:
PHP, Java, C++,
Yuqoridagi misolda biz tartibsiz to'plamdan elementni olib tashlash uchun erase() usulidan foydalanganmiz.
Dastlab tartibsiz tillar {"C++", "Python", "Java", "PHP"} dir.
Keyin, "Python" qiymatiga ega elementni olib tashlash uchun erase() usulidan foydalandik.
// qiymati bo'lgan elementni olib tashlang: "Python"
languages.erase("Python");
Shunday qilib, oxirgi tartibsiz to'plam {"PHP", "Java", "C++"} bo'ladi.
[!NOTE] Tartibsiz to'plamning barcha elementlarini olib tashlash uchun
clear()usulidan foydalanishimiz mumkin.
Tartibsiz to'plamda element mavjudligini tekshirish uchun quyidagi usullardan foydalanishimiz mumkin.
-find() - agar qiymat topilsa, iteratorni elementga qaytaradi, aks holda end() iteratorini qaytaradi
-count() - agar qiymat mavjud bo'lsa 1 ni, agar mavjud bo'lmasa 0 ni qaytaradi
Masalan,
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<int> primes {2, 3, 5, 7, 11, 13};
cout << "Using find():" << endl;
cout << "Does number " << 12 << " exist? ";
// find() qiymati topilmasa, primes.end() ni qaytaradi
if (primes.find(12) != primes.end()) {
cout << "Yes";
}
else {
cout << "No";
}
cout << "\n\nUsing count():" << endl;
cout << "Does number " << 7 << " exist? ";
// Agar qiymat mavjud bo'lmasa, count() 0 ni qaytaradi
if (primes.count(7)) {
cout << "Yes";
}
else {
cout << "No";
}
return 0;
}
Chiqish
Using find():
Does number 12 exist? No
Using count():
Does number 7 exist? Yes
Yuqoridagi misolda biz find() va count() dan tartibsiz to'plamda berilgan qiymat mavjudligini tekshirish uchun foydalandik.
Dastlab, biz 12 qiymati mavjudligini tekshirish uchun find() usulidan foydalandik.
// 12 qiymati mavjudligini tekshiradi
if (primes.find(12) != primes.end()) {
cout << "Yes";
}
else {
cout << "No";
}
find() usuli, agar mavjud bo'lsa, elementga ishora qiluvchi iteratorni qaytaradi. Agar qiymat mavjud bo'lmasa, u end() iteratoriga ishora qiladi.
Keyin, biz 7 qiymatining mavjudligini tekshirish uchun count() usulidan foydalandik.
// 7 qiymati mavjudligini tekshiradi
if (primes.count(7)) {
cout << "Yes";
}
else {
cout << "No";
}
size() usuli yordamida tartibsiz to'plam hajmini olishimiz mumkin. Bu alohida elementlarning umumiy sonini beradi. Masalan,
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<int> numbers {1, 100, 10, 70, 100};
cout << "Size: " << numbers.size();
return 0;
}
Chiqish
Size: 4
Yuqoridagi misolda biz aniq elementlarning umumiy sonini olish uchun size() usulidan foydalandik.
E'tibor bering, biz tartibsiz to'plamni 1, 100, 10, 70, 100 elementlari bilan ishga tushirdik. Lekin tartibsiz ro'yxatning o'lchami 4 ga teng.
Buning sababi, 100-elementning dublikati bor, shuning uchun aslida 5 emas, balki 4 ta alohida element mavjud.