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