Utilisez set lorsque:
- Nous avons besoin de données ordonnées (éléments distincts).
- Nous aurions à imprimer / accéder aux données (dans l'ordre trié).
- Nous avons besoin d'un prédécesseur / successeur d'éléments.
Utilisez unordered_set lorsque:
- Nous devons conserver un ensemble d'éléments distincts et aucune commande n'est requise.
- Nous avons besoin d'un accès à un élément, c'est-à-dire pas de traversée.
Exemples:
ensemble:
Entrée: 1, 8, 2, 5, 3, 9
Sortie: 1, 2, 3, 5, 8, 9
Unordered_set:
Entrée: 1, 8, 2, 5, 3, 9
Sortie: 9 3 1 8 2 5 (peut-être cet ordre, influencé par la fonction de hachage)
Principalement différence:
Remarque: (dans certains cas, set
c'est plus pratique) par exemple en utilisant vector
comme clé
set<vector<int>> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl; // I have override << for vector
// 1 2
// 1 3
La raison pour laquelle vector<int>
peut être aussi clé set
que le vector
remplacement operator<
.
Mais si vous utilisez, unordered_set<vector<int>>
vous devez créer une fonction de hachage pour vector<int>
, car vector n'a pas de fonction de hachage, vous devez donc en définir une comme:
struct VectorHash {
size_t operator()(const std::vector<int>& v) const {
std::hash<int> hasher;
size_t seed = 0;
for (int i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
return seed;
}
};
vector<vector<int>> two(){
//unordered_set<vector<int>> s; // error vector<int> doesn't have hash function
unordered_set<vector<int>, VectorHash> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl;
// 1 2
// 1 3
}
vous pouvez voir que dans certains cas, unordered_set
c'est plus compliqué.
Principalement cité à partir de:
https://www.geeksforgeeks.org/set-vs-unordered_set-c-stl/
https://stackoverflow.com/a/29855973/6329006