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;
}