std::set
Főnév
- (informatika) A
std::setegy rendezett és ismétlődő elemeket nem tartalmazó adatszerkezet a C++ Standard Template Library (STL) részeként. Az elemek automatikusan növekvő sorrendben tárolódnak, és gyors keresést, beszúrást és törlést biztosít (O(log n) időben) egy piros-fekete fa (Red-Black Tree) segítségével.
A set használatához be kell illeszteni az #include <set> fejlécet.
1. std::set létrehozása és alapműveletek
A set deklarálásakor meg kell adni az elemek típusát, például std::set<int> egész számokhoz.
Példa: Alap set létrehozás és kiírás
#include <iostream>
#include <set>
int main() {
std::set<int> szamok = {5, 3, 8, 1, 5}; // Ismétlődő elemek NEM kerülnek be
szamok.insert(10); // Új elem beszúrása
szamok.insert(3); // Nem kerül be újra, mert már benne van
std::cout << "A set elemei: ";
for (int szam : szamok) {
std::cout << szam << " ";
}
std::cout << std::endl;
return 0;
}
✅ A set automatikusan rendezi az elemeket növekvő sorrendbe!
✅ A duplikált elemek nem kerülnek be!
Kimenet:
A set elemei: 1 3 5 8 10
2. Elemműveletek (insert, erase, find)
A set támogatja az elemek beszúrását, keresését és törlését.
Elem hozzáadása (insert)
szamok.insert(20); // Hozzáadja a 20-at a halmazhoz
🔹 Ha az elem már létezik, nem kerül be újra.
Elem keresése (find)
if (szamok.find(8) != szamok.end()) {
std::cout << "A 8 benne van a halmazban!" << std::endl;
} else {
std::cout << "A 8 nincs benne!" << std::endl;
}
🔹 find(x) visszaad egy iterátort az x elemre, vagy end() ha nincs benne.
Elem törlése (erase)
szamok.erase(3); // Kitörli a 3-as számot
🔹 Ha az elem nincs benne, nem történik semmi.
Összes elem törlése (clear)
szamok.clear(); // Minden elem törlése
🔹 A clear() teljesen kiüríti a set-et.
3. Iterálás a set elemein
A set bejárására többféle módszer is használható.
Hagyományos for ciklus iterátorral
for (std::set<int>::iterator it = szamok.begin(); it != szamok.end(); ++it) {
std::cout << *it << " ";
}
🔹 begin() az első elemre mutat.
🔹 end() az utolsó utáni elemre mutat.
for-each ciklus
for (int szam : szamok) {
std::cout << szam << " ";
}
✅ Egyszerűbb és könnyebben olvasható.
4. Halmazműveletek (set_union, set_intersection, set_difference)
A set támogatja a halmazműveleteket, például a metszetet, uniót és különbséget.
Metszet (közös elemek)
#include <iostream>
#include <set>
#include <algorithm>
int main() {
std::set<int> A = {1, 2, 3, 4, 5};
std::set<int> B = {3, 4, 5, 6, 7};
std::set<int> metszet;
std::set_intersection(A.begin(), A.end(), B.begin(), B.end(),
std::inserter(metszet, metszet.begin()));
std::cout << "Metszet: ";
for (int elem : metszet) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
Kimenet:
Metszet: 3 4 5
Unió (összes egyedi elem)
std::set<int> unio;
std::set_union(A.begin(), A.end(), B.begin(), B.end(),
std::inserter(unio, unio.begin()));
Különbség (A - B)
std::set<int> kulonbseg;
std::set_difference(A.begin(), A.end(), B.begin(), B.end(),
std::inserter(kulonbseg, kulonbseg.begin()));
5. Méret és egyéb információk
A set lehetőséget ad az elemek számának és állapotának ellenőrzésére.
std::cout << "Elemek száma: " << szamok.size() << std::endl;
std::cout << "Üres? " << (szamok.empty() ? "Igen" : "Nem") << std::endl;
std::cout << "Benne van a 10? " << szamok.count(10) << std::endl;
🔹 size() – Az elemek számát adja vissza.
🔹 empty() – Igaz, ha üres.
🔹 count(x) – Ha az x benne van, 1-et ad vissza, különben 0-t.
6. Fordított sorrend (greater<T>)
A set alapértelmezett sorrendje növekvő. Ha csökkenő sorrendben szeretnénk tárolni az elemeket:
std::set<int, std::greater<int>> fordított_szamok = {10, 5, 8, 3, 1};
🔹 Ez fordított (csökkenő) sorrendben tárolja az elemeket.
7. unordered_set – Gyorsabb alternatíva
Ha nem számít a rendezés, használhatjuk az unordered_set-et, amely hash táblán alapul és átlagosan O(1) műveleteket biztosít.
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> szamok = {5, 3, 8, 1, 5};
szamok.insert(10);
std::cout << "Az unordered_set elemei: ";
for (int szam : szamok) {
std::cout << szam << " ";
}
std::cout << std::endl;
return 0;
}
🔹 Rendezetlen, de gyorsabb keresés és beszúrás (O(1) átlagosan).
Összegzés
Az std::set egy hatékony adatszerkezet, ha egyedi és rendezett elemeket szeretnénk tárolni: ✅ Automatikusan rendezett
✅ Ismétlődő elemeket nem tartalmaz
✅ O(log n) keresés, beszúrás és törlés
✅ Könnyen végezhető halmazműveletek
Ha sebesség a legfontosabb és nem kell rendezett adatszerkezet, az unordered_set jobb választás. 🚀