set library (tsz. set libraries)
set
a C++ Standard Template Library (STL) egyik adatszerkezete, amely egy rendezett, egyedi elemeket tartalmazó gyűjtemény. Az std::set
a piros-fekete fa (Red-Black Tree) alapú megvalósítás miatt logaritmikus időben (O(log n)) végez keresést, beszúrást és törlést.A set
használatához az #include <set>
fejlécet kell beilleszteni a programba.
set
létrehozása és alapvető használataEgy set
létrehozása egyszerű, és az elemek automatikusan növekvő sorrendbe kerülnek.
set
műveletek#include <iostream>
#include <set>
int main() {
std::set<int> szamok = {5, 3, 8, 1, 5}; // Egyedi elemek
szamok.insert(10); // Új elem beszúrása
szamok.insert(3); // Nem adja hozzá, mert már létezik
std::cout << "A set elemei: ";
for (int szam : szamok) {
std::cout << szam << " ";
}
std::cout << std::endl;
return 0;
}
✅ A set
automatikusan rendezi az elemeket!
✅ Az ismétlődő elemek nem kerülnek bele!
A set elemei: 1 3 5 8 10
insert
, erase
, find
)
insert
)szamok.insert(20); // Hozzáadja a 20-at a halmazhoz
🔹 Ha az elem már benne van, nem történik semmi.
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 set
lehetővé teszi a halmazműveleteket, mint a metszet, unió és különbség.
#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()));
set
speciális funkciói
size()
, empty()
és count()
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.
A set
alapértelmezett sorrendje növekvő.
greater<T>
)std::set<int, std::greater<int>> fordított_szamok = {10, 5, 8, 3, 1};
🔹 Ez csökkenő sorrendben tárolja az elemeket.
unordered_set
– Gyorsabb alternatívaHa nem számít a sorrend, 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. 🚀