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
| Caratteristica | Descrizione |
|---|---|
| Ordine | ❌ Non garantito |
| Duplicati | ❌ Non ammessi |
| Struttura interna | Tabella hash |
| Ricerca media | ✔️ O(1) |
| Peggior caso | ❌ O(n) |
4️⃣ Metodi principali di unordered_set
| Metodo | Descrizione |
|---|---|
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
| set | unordered_set | |
|---|---|---|
| Ordine | ✔️ Ordinato | ❌ Non ordinato |
| Ricerca | O(log n) | O(1) media |
| Struttura interna | Albero Red-Black | Hash table |
| Iterazione | Ordinata | Casuale |
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.
- Libreria
<unordered_set> - Funzioni di hashing integrate
- Metodi insert, erase, count, find
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_setin un unico insieme. - Crea un filtro che accetta solo numeri non duplicati nelle ultime 20 letture.