std::unordered_set în C++

Mulțime de valori unice bazată pe hash: verificare „există?” în timp mediu constant, fără ordine.

Sintaxă
#include <unordered_set>

std::unordered_set<T> nume;
std::unordered_multiset<T> nume;

Ce face std::unordered_set

std::unordered_set ține valori fără repetiții, ca std::set, dar într-o tabelă hash: insert, contains, find și erase durează în medie O(1). Elementele nu sunt sortate, iar ordinea la parcurgere nu este garantată.

std::unordered_multiset este varianta care permite duplicate; count(x) spune de câte ori apare o valoare. La ambele, un rehash (la creștere) invalidează iteratorii.

Parametri

Parametru Descriere
T Tipul elementelor; are nevoie de std::hash<T> și de ==.

Ce returnează

Un obiect unordered_set sau unordered_multiset.

Exemple

Exemplul 1: Elemente comune, afișate sortat

Ordinea din setul neordonat nu este fixă, deci copiem rezultatul într-un vector și îl sortăm înainte de afișare.

#include <algorithm>
#include <print>
#include <string>
#include <unordered_set>
#include <vector>

int main() {
    std::vector<std::string> luni{"Ana", "Ion", "Dan", "Maria"};
    std::vector<std::string> marti{"Maria", "Radu", "Ana"};

    std::unordered_set<std::string> prezenti_luni(luni.begin(), luni.end());
    std::vector<std::string> ambele_zile;
    for (const auto& nume : marti) {
        if (prezenti_luni.contains(nume)) {
            ambele_zile.push_back(nume);
        }
    }
    std::ranges::sort(ambele_zile);
    std::println("Prezenți în ambele zile: {}", ambele_zile);
}

Rezultat

Prezenți în ambele zile: ["Ana", "Maria"]

Exemplul 2: unordered_multiset: frecvențe

#include <print>
#include <unordered_set>

int main() {
    std::unordered_multiset<int> zaruri{6, 2, 6, 3, 6, 2};
    for (int fata = 1; fata <= 6; ++fata) {
        std::print("{}:{} ", fata, zaruri.count(fata));
    }
    std::println();
    std::unordered_set<int> unice(zaruri.begin(), zaruri.end());
    std::println("Valori distincte: {}", unice.size());
}

Rezultat

1:0 2:2 3:1 4:0 5:0 6:3 
Valori distincte: 3

Greșeli frecvente

  • Afișezi direct un unordered_set și te bazezi pe ordine. Altă bibliotecă sau alte date dau altă ordine; sortează înainte.
  • Pui în set structuri proprii fără std::hash: eroare de compilare. Definește hash-ul sau folosește std::set cu operator<.

Comenzi înrudite

  • std::set: Mulțime ordonată de valori unice: elimină automat duplicatele și păstrează elementele sortate.
  • std::unordered_map: Dicționar bazat pe tabelă hash: căutare în timp mediu constant, dar fără o ordine anume a elementelor.
  • std::multiset: Mulțime ordonată care permite valori repetate; util pentru valori sortate cu frecvență.