Linguaggio C++

Libreria Unordered_set

Introduzione alla libreria unordered_set del C++: contenitore non ordinato basato su tabella hash, metodi principali e laboratorio guidato.

La libreria <unordered_set> fornisce il contenitore std::unordered_set, una struttura che memorizza elementi unici ma non ordinati.

Diversamente da set (che usa un albero bilanciato), unordered_set utilizza una tabella hash, ottenendo:

  • ricerca molto veloce (media O(1))
  • inserimenti veloci
  • nessun ordinamento degli elementi

È il contenitore ideale quando serve testare velocemente la presenza di un elemento.


1️⃣ Inclusione della libreria


#include <unordered_set>
using namespace std;

2️⃣ Dichiarazione e inizializzazione


unordered_set S = {3, 1, 4, 1, 5, 9};
// Il 1 duplicato viene ignorato

Le iterazioni non rispettano ordine crescente, perché l ordine dipende dall hash.


3️⃣ Caratteristiche principali di unordered_set

CaratteristicaDescrizione
Ordine❌ Non garantito
Duplicati❌ Non ammessi
Struttura internaTabella hash
Ricerca media✔️ O(1)
Peggior caso❌ O(n)

4️⃣ Metodi principali di unordered_set

MetodoDescrizione
insert(x)Inserisce x (se non già presente)
erase(x)Rimuove x
find(x)Restituisce iteratore a x
count(x)Ritorna 0 o 1
size()Numero elementi
empty()Verifica se è vuoto
clear()Svuota il contenitore

5️⃣ Inserimento e iterazione


unordered_set S;

S.insert(5);
S.insert(1);
S.insert(3);

for(int x : S)
    cout << x << " ";  // ordine NON garantito

6️⃣ Ricerca veloce


if(S.count(3))
    cout << "Presente!";

7️⃣ Differenze tra set e unordered_set

setunordered_set
Ordine✔️ Ordinato❌ Non ordinato
RicercaO(log n)O(1) media
Struttura internaAlbero Red-BlackHash table
IterazioneOrdinataCasuale

8️⃣ Esempio completo


unordered_set parole;

parole.insert("casa");
parole.insert("auto");
parole.insert("gatto");

if(parole.count("casa"))
    cout << "Trovata";

parole.erase("auto");
LABORATORIO

Uso del Contenitore unordered_set

In questo laboratorio imparerai a utilizzare std::unordered_set per gestire insiemi di valori unici con inserimenti e ricerche molto veloci.


1 Rimuovi duplicati velocemente

Chiedi all utente 10 numeri e inseriscili in un unordered_set per eliminare automaticamente i duplicati.


unordered_set S;
int x;

for(int i=0; i<10; i++){
    cin >> x;
    S.insert(x);
}

2 Ricerca istantanea

Chiedi un numero e verifica se esiste.


cin >> x;

if(S.count(x))
    cout << "Trovato!";
else
    cout << "Non presente.";

3 Filtrare parole proibite

Crea un dizionario di parole vietate e controlla un testo.


unordered_set vietate = {"spam", "virus", "ban"};

string parola;
cin >> parola;

if(vietate.count(parola))
    cout << "Parola non consentita!";

4 Esercizi

  • Conta quante parole diverse inserisce l utente.
  • Realizza un dizionario di 100 parole uniche generate casualmente.
  • Unisci due unordered_set in un unico insieme.
  • Crea un filtro che accetta solo numeri non duplicati nelle ultime 20 letture.