std::set
egy 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.
std::set
létrehozása és alapműveletekA set
deklarálásakor meg kell adni az elemek típusát, például std::set<int>
egész számokhoz.
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!
A set elemei: 1 3 5 8 10
insert
, erase
, find
)A set
támogatja az elemek beszúrását, keresését és törlését.
insert
)szamok.insert(20); // Hozzáadja a 20-at a halmazhoz
🔹 Ha az elem már létezik, nem kerül be újra.
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.
erase
)szamok.erase(3); // Kitörli a 3-as számot
🔹 Ha az elem nincs benne, nem történik semmi.
clear
)szamok.clear(); // Minden elem törlése
🔹 A clear()
teljesen kiüríti a set
-et.
set
elemeinA set
bejárására többféle módszer is használható.
for
ciklus iterátorralfor (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
ciklusfor (int szam : szamok) {
std::cout << szam << " ";
}
✅ Egyszerűbb és könnyebben olvasható.
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.
#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;
}
Metszet: 3 4 5
std::set<int> unio;
std::set_union(A.begin(), A.end(), B.begin(), B.end(),
std::inserter(unio, unio.begin()));
A - B
)std::set<int> kulonbseg;
std::set_difference(A.begin(), A.end(), B.begin(), B.end(),
std::inserter(kulonbseg, kulonbseg.begin()));
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.
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.
unordered_set
– Gyorsabb alternatívaHa 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).
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. 🚀