Middle
C++ da std::set va std::unordered_set ni qachon ishlatish kerak?
sobes.tech AI
AIdan javob
std::set va std::unordered_set takrorlanmaydigan elementlarni saqlash uchun ishlatiladi. Ular orasidan tanlov ularning ustuvorligiga bog‘liq: tartib yoki kirish/qo‘shish/uchirishning samaradorligi.
std::set muvozanatlangan ikkilamchi qidiruv daraxtiga asoslangan (odatda qizil-oq daraxt).
std::set ning xususiyatlari:
- Elementlar tartiblangan holda saqlanadi.
- Elementlarni qo‘shish, o‘chirish va qidirish o‘rtacha O(log N) vaqt oladi, bu yerda N elementlar soni.
- Elementlar tartiblangan bo‘lishi muhim bo‘lsa yoki ma’lum bir diapazonda elementlarni olish kerak bo‘lsa mos keladi.
std::unordered_set hash jadvaliga asoslangan.
std::unordered_set ning xususiyatlari:
- Elementlar tartiblangan holda saqlanmaydi.
- Elementlarni qo‘shish, o‘chirish va qidirish o‘rtacha O(1) vaqt oladi, lekin eng yomon holatda (hash funktsiyasida ko‘p to‘qnashuvlar bo‘lsa) O(N) ga yetishi mumkin.
- Element turi uchun hash funktsiyasi (
std::hash) va tenglik operatori (operator==) belgilangan bo‘lishi kerak. - Maksimal tezlik bilan qo‘shish, o‘chirish va qidirish talab qilinadigan va elementlarning tartibi muhim bo‘lmagan holatlar uchun mos keladi.
Qisqacha jadval:
| Mezon | std::set |
std::unordered_set |
|---|---|---|
| Ichki tuzilma | Muvozanatlangan daraxt | Hash jadvali |
| Elementlarning tartibi | Tartiblangan | Tartibsiz |
| O‘rtacha qidirish/qo‘shish/uchirish vaqti | O(log N) | O(1) |
| Eng yomon holatdagi vaqti | O(log N) | O(N) |
| Turi uchun talablar | < operatori |
std::hash, operator== |
std::set dan foydalanish misoli:
#include <iostream>
#include <set>
int main() {
std::set<int> tartiblangan_set;
tartiblangan_set.insert(5);
tartiblangan_set.insert(2);
tartiblangan_set.insert(8);
// Elementlar tartib bilan chiqariladi: 2 5 8
for (int qiymat : tartiblangan_set) {
std::cout << qiymat << " ";
}
std::cout << std::endl;
return 0;
}
std::unordered_set dan foydalanish misoli:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> tartibsiz_set;
tartibsiz_set.insert(5);
tartibsiz_set.insert(2);
tartibsiz_set.insert(8);
// Chiqish tartibi o‘zgarishi mumkin
for (int qiymat : tartibsiz_set) {
std::cout << qiymat << " ";
}
std::cout << std::endl;
return 0;
}