Sobes.tech
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;
}