Middle
Kad jālieto std::set un kad std::unordered_set C++?
sobes.tech AI
Atbilde no AI
std::set un std::unordered_set tiek izmantoti, lai glabātu unikālus elementus. Izvēle starp tiem ir atkarīga no prioritātēm: kārtība vai veiktspēja piekļuvei/ievietošanai/izņemšanai.
std::set balstīts uz līdzsvarotu bināro meklēšanas koku (parasti sarkano-melno koku).
std::set īpašības:
- Elementi tiek glabāti sakārtotā secībā.
- Ievietošana, dzēšana un meklēšana ilgst O(log N) laiku, kur N ir elementu skaits.
- Piemērots, ja ir svarīga elementu sakārtotā secība vai ja nepieciešams iegūt elementus noteiktā diapazonā.
std::unordered_set balstīts uz haštabulu.
std::unordered_set īpašības:
- Elementi netiek glabāti sakārtotā secībā.
- Ievietošana, dzēšana un meklēšana vidēji ilgst O(1), bet sliktākajos gadījumos (ja ir daudz kolīziju) var sasniegt O(N).
- Prasība, lai elementa tips būtu definēta ar noteiktu hašfunkciju (
std::hash) un vienādojuma operatoru (operator==). - Piemērots, ja nepieciešama maksimāla ātruma ievietošanai, dzēšanai un meklēšanai, un elementu kārtība nav svarīga.
Salīdzināšanas tabula:
| Kritērijs | std::set |
std::unordered_set |
|---|---|---|
| Iekšējā struktūra | Līdzsvarots koks | Haštabula |
| Elementu kārtība | Sakārtota | Nesakārtota |
| Laiks meklēšanai/ievietošanai/izņemšanai (vidēji) | O(log N) | O(1) |
| Laiks meklēšanai/ievietošanai/izņemšanai (sliktākais) | O(log N) | O(N) |
| Prasības tipam | < operators |
std::hash, operator== |
Piemērs std::set izmantošanai:
#include <iostream>
#include <set>
int galvenais() {
std::set<int> sakārtots_set;
sakārtots_set.insert(5);
sakārtots_set.insert(2);
sakārtots_set.insert(8);
// Elementi tiks izvadīti sakārtotā secībā: 2 5 8
for (int vērtība : sakārtots_set) {
std::cout << vērtība << " ";
}
std::cout << std::endl;
return 0;
}
Piemērs std::unordered_set izmantošanai:
#include <iostream>
#include <unordered_set>
int galvenais() {
std::unordered_set<int> nesakārtots_set;
nesakārtots_set.insert(5);
nesakārtots_set.insert(2);
nesakārtots_set.insert(8);
// Izvades secība var atšķirties
for (int vērtība : nesakārtots_set) {
std::cout << vērtība << " ";
}
std::cout << std::endl;
return 0;
}