Sobes.tech
Middle

Кай вақт бояд дар C++ std::set ва std::unordered_set истифода шавад?

sobes.tech AI

Ҷавоб аз AI

std::set ва std::unordered_set барои нигоҳ доштани уник ё элементҳо истифода мешаванд. Интихоб байни онҳо ба афзалиятҳо вобаста аст: тартибёбӣ ё суръати дастрасӣ/вуруд/хориҷ.

std::set асос ёфтааст ба дарختаи ҷустуҷӯии бинарӣ (одатан дарختаи сурх-сиёҳ).

Хусусиятҳои std::set:

  • Элементҳо дар тартиби сортшуда нигоҳ дошта мешаванд.
  • Вуруд, хориҷ ва ҷустуҷӯи элементҳо дар вақти O(log N) сурат мегирад, ки N шумораи элементҳо мебошад.
  • Мувофиқ аст, вақте ки муҳим аст тартиби сортшуда ё гирифтани элементҳо дар диапазони муайян.

std::unordered_set асос ёфтааст ба хештаблиҷ.

Хусусиятҳои std::unordered_set:

  • Элементҳо дар тартиби сортшуда нигоҳ дошта намешаванд.
  • Вуруд, хориҷ ва ҷустуҷӯи элементҳо дар миёна O(1) сурат мегирад, аммо дар ҳолати бад (бо зиёда шудани коллизияҳои функсияи хеш) метавонад ба O(N) расад.
  • Талаб мекунад, ки навъи элемент функсияи хеш муайян дошта бошад (std::hash) ва оператори муқоиса барои баробарӣ (operator==).
  • Мувофиқ аст, вақте ки ба суръати максималӣ дар воридот, хориҷ ва ҷустуҷӯи ниёз аст ва тартиби элементҳо муҳим нест.

Таблиғи муқоиса:

Критерий std::set std::unordered_set
Сохтори дохилӣ Дарختаи мувозоншуда Хештаблиҷ
Тартиби элементҳо Тартибёфта Нитартибёфта
Вақти ҷустуҷӯ/вуруд/хориҷ (миёна) O(log N) O(1)
Вақти ҷустуҷӯ/вуруд/хориҷ (бадтарин) O(log N) O(N)
Талабот ба навъи Оператор < std::hash, operator==

Маслиҳат барои истифодаи std::set:

#include <iostream>
#include <set>

int main() {
    std::set<int> тартибёфта_массив;
    тартибёфта_массив.insert(5);
    тартибёфта_массив.insert(2);
    тартибёфта_массив.insert(8);

    // Элементҳо дар тартиб ёфтан: 2 5 8
    for (int арзиш : тартибёфта_массив) {
        std::cout << арзиш << " ";
    }
    std::cout << std::endl;

    return 0;
}

Маслиҳат барои истифодаи std::unordered_set:

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> нитартибёфта_массив;
    нитартибёфта_массив.insert(5);
    нитартибёфта_массив.insert(2);
    нитартибёфта_массив.insert(8);

    // Тартиб дар баромад метавонад фарқ кунад
    for (int арзиш : нитартибёфта_массив) {
        std::cout << арзиш << " ";
    }
    std::cout << std::endl;

    return 0;
}