Sobes.tech
Middle

Quand doit-on utiliser std::set et quand std::unordered_set en C++?

sobes.tech IA

Réponse de l'IA

std::set et std::unordered_set sont utilisés pour stocker des éléments uniques. Le choix entre eux dépend des priorités : ordonnancement ou performance d'accès/insertion/suppression.

std::set est basé sur un arbre binaire de recherche équilibré (généralement un arbre rouge-noir).

Caractéristiques de std::set :

  • Les éléments sont stockés dans un ordre trié.
  • L'insertion, la suppression et la recherche d'éléments prennent en moyenne O(log N), où N est le nombre d'éléments.
  • Convient lorsque l'ordre des éléments est important ou lorsque l'on souhaite obtenir des éléments dans un intervalle spécifique.

std::unordered_set est basé sur une table de hachage.

Caractéristiques de std::unordered_set :

  • Les éléments ne sont pas stockés dans un ordre trié.
  • L'insertion, la suppression et la recherche d'éléments prennent en moyenne O(1), mais dans le pire cas (avec beaucoup de collisions de la fonction de hachage) peuvent atteindre O(N).
  • Nécessite que le type d'élément ait une fonction de hachage (std::hash) et un opérateur de comparaison d'égalité (operator==).
  • Convient lorsque l'on souhaite des opérations d'insertion, de suppression et de recherche très rapides, sans importance de l'ordre des éléments.

Tableau récapitulatif :

Critère std::set std::unordered_set
Structure interne Arbre équilibré Table de hachage
Ordre des éléments Trié Non trié
Temps de recherche/insertion/suppression (moyenne) O(log N) O(1)
Temps de recherche/insertion/suppression (pire cas) O(log N) O(N)
Exigences du type Opérateur < std::hash, operator==

Exemple d'utilisation de std::set :

#include <iostream>
#include <set>

int main() {
    std::set<int> ordered_set;
    ordered_set.insert(5);
    ordered_set.insert(2);
    ordered_set.insert(8);

    // Les éléments seront affichés dans l'ordre : 2 5 8
    for (int val : ordered_set) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}

Exemple d'utilisation de std::unordered_set :

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> unordered_set;
    unordered_set.insert(5);
    unordered_set.insert(2);
    unordered_set.insert(8);

    // L'ordre d'affichage peut varier
    for (int val : unordered_set) {
        std::cout << val << " ";
    }
    std::cout << std::endl;

    return 0;
}