unordered associative container (tsz. unordered associative containers)
unordered_*
konténerek) a C++ Standard Library részei, és az STL (Standard Template Library) biztosítja őket. Ezek a konténerek olyan hash-alapú adatstruktúrákat valósítanak meg, amelyek gyors beszúrást, keresést és törlést biztosítanak.A nem rendezett konténerek főbb jellemzői: ✅ Gyors keresés, beszúrás és törlés → Átlagosan O(1) időkomplexitás
✅ Hash tábla alapú tárolás → Az elemek nem rendezettek
❌ Nincs garantált sorrend → Az elemek sorrendje változhat
unordered_*
konténerek típusaiKonténer | Leírás |
---|---|
unordered_set
|
Egyedi elemekből álló halmaz |
unordered_multiset
|
Többször előforduló elemekből álló halmaz |
unordered_map
|
Kulcs-érték párokat tároló asszociatív tömb |
unordered_multimap
|
Olyan unordered_map , amelyben duplikált kulcsok is lehetnek
|
unordered_set
(Nem rendezett halmaz)A std::unordered_set
egy halmaz, amelyben minden elem egyedi, és nincs meghatározott sorrend.
insert
, erase
, find
)#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
unordered_set<int> szamok = {5, 2, 8, 1, 10};
szamok.insert(3); // Elem hozzáadása
szamok.erase(2); // Elem törlése
if (szamok.find(8) != szamok.end()) {
cout << "A 8 benne van a halmazban!" << endl;
}
cout << "Elemek az unordered_set-ben: ";
for (int n : szamok) {
cout << n << " ";
}
return 0;
}
📌 Megjegyzés: - A find()
függvény O(1)
átlagos időben keres. - Az elemek nem garantált sorrendben kerülnek kiírásra!
unordered_multiset
(Nem rendezett multihalmaz)A std::unordered_multiset
ugyanaz, mint az unordered_set
, de tartalmazhat duplikált elemeket.
#include <iostream>
#include <unordered_multiset>
using namespace std;
int main() {
unordered_multiset<int> szamok = {5, 2, 8, 2, 10};
szamok.insert(2); // Még egy 2-es hozzáadása
szamok.erase(2); // Az ÖSSZES 2-est törli!
cout << "Elemek az unordered_multiset-ben: ";
for (int n : szamok) {
cout << n << " ";
}
return 0;
}
📌 Megjegyzés: - Az erase(2)
az összes 2-es elemet törli.
unordered_map
(Nem rendezett térkép)A std::unordered_map
egy kulcs-érték párokat tároló asszociatív tömb.
insert
, erase
, find
)#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> diakok = {
{"Anna", 90},
{"Béla", 85},
{"Csaba", 78}
};
diakok = 92; // Új elem hozzáadása
diakok.erase("Béla"); // Kulcs törlése
if (diakok.find("Anna") != diakok.end()) {
cout << "Anna pontszáma: " << diakok << endl;
}
cout << "Diákok pontszámai:" << endl;
for (const auto &par : diakok) {
cout << par.first << ": " << par.second << endl;
}
return 0;
}
📌 Megjegyzés: - A find()
gyorsan keres kulcs alapján O(1) átlagos idővel. - A kulcsok nem garantált sorrendben jelennek meg.
unordered_multimap
(Nem rendezett multitérkép)A std::unordered_multimap
ugyanaz, mint az unordered_map
, de megengedi a duplikált kulcsokat.
#include <iostream>
#include <unordered_multimap>
using namespace std;
int main() {
unordered_multimap<string, int> pontok = {
{"Anna", 90},
{"Béla", 85},
{"Anna", 78} // Anna kétszer is szerepelhet!
};
pontok.insert({"Dóra", 92});
cout << "Diákok pontszámai:" << endl;
for (const auto &par : pontok) {
cout << par.first << ": " << par.second << endl;
}
return 0;
}
📌 Megjegyzés: - Az unordered_multimap
lehetővé teszi, hogy egy kulcshoz több érték is tartozzon.
Konténer | Egyedi elemek | Rendezett? | Beszúrás/Törlés/Keresés |
---|---|---|---|
unordered_set
|
✅ | ❌ | O(1) (átlagosan) |
unordered_multiset
|
❌ | ❌ | O(1) (átlagosan) |
unordered_map
|
✅ | ❌ | O(1) (átlagosan) |
unordered_multimap
|
❌ | ❌ | O(1) (átlagosan) |
unordered_*
vs. ordered_*
(Hash vs. Fa)C++ biztosít rendezett (set
, map
) és nem rendezett (unordered_set
, unordered_map
) konténereket.
Tulajdonság | unordered_* konténerek
|
ordered_* konténerek (set , map )
|
---|---|---|
Sorrend | Nincs rendezés | Kulcs szerint rendezett |
Keresési idő | O(1) (átlagosan) | O(log n) (fa alapú) |
Adatszerkezet | Hash tábla | Piros-fekete fa |
Használati példa | Gyors kulcsalapú keresés | Ha szükség van rendezett adatokra |
✅ Mikor használjuk az unordered_*
konténereket?
- Ha gyors keresés, beszúrás vagy törlés kell, és nem számít a rendezés. - Nagyméretű adatok kezelésekor, mivel az unordered_*
jobb teljesítményt biztosít.
✅ Mikor használjuk az ordered_*
konténereket?
- Ha a kulcsok rendezése fontos (pl. lexikografikus sorrendben). - Ha hatékony intervallumkeresésre van szükség.
unordered_*
konténerek gyorsabbak lehetnek, mert hash tábla alapúak.unordered_set
→ Egyedi elemek, unordered_multiset
→ Duplikált elemek.unordered_map
→ Egyedi kulcs-érték párok, unordered_multimap
→ Duplikált kulcsok.unordered_*
ajánlott! 🚀