std::map
a C++ Standard Library egyik leggyakrabban használt tárolója, amely egy kulcs-érték párokat tartalmazó, rendezett asszociatív konténer. A std::map
belsőleg egy kiegyensúlyozott bináris keresőfát (általában vörös-fekete fát) használ, ami garantálja a hatékony beszúrást, törlést és keresést (O(\log n) időkomplexitással.
A std::map
használatához be kell húzni a megfelelő fejlécfájlt:
#include <map>
A std::map
sablonos osztály, így a deklaráció a következő formát követi:
std::map<KulcsTípus, ÉrtékTípus> mapNeve;
Példa:
std::map<int, std::string> szotar;
Ebben az esetben az int
a kulcs típusa, a std::string
pedig az érték típusa.
std::map
-pel
A std::map
-be többféleképpen lehet beszúrni elemeket:
Alapértelmezett hozzárendeléssel:
szotar = "alma";
szotar = "körte";
Ha a kulcs nem létezik, akkor létrehozza és inicializálja az alapértelmezett értékkel.
insert()
függvénnyel:
szotar.insert({3, "banán"});
szotar.insert(std::make_pair(4, "szilva"));
Az insert()
csak akkor ad hozzá új elemet, ha a kulcs még nem szerepel.
emplace()
függvénnyel:
szotar.emplace(5, "barack");
Az emplace()
hatékonyabb lehet, mivel közvetlenül az objektumot hozza létre.
operator
segítségével:
std::cout << szotar << std::endl; // "alma"
Ha a kulcs nem létezik, létrehoz egy új bejegyzést alapértelmezett értékkel.
at()
metódussal (biztonságosabb, mert kivételt dob, ha nincs ilyen kulcs):
std::cout << szotar.at(2) << std::endl; // "körte"
find()
metódussal:
auto it = szotar.find(3);
if (it != szotar.end()) {
std::cout << "Megtalált érték: " << it->second << std::endl;
}
Ha nincs ilyen kulcs, akkor az end()
iterátort adja vissza.
count()
metódussal (eldönti, hogy létezik-e egy kulcs):
if (szotar.count(3) > 0) {
std::cout << "A kulcs létezik!" << std::endl;
}
Kulcs alapján:
szotar.erase(2);
Iterátor alapján:
auto it = szotar.find(3);
if (it != szotar.end()) {
szotar.erase(it);
}
Tartomány törlése:
szotar.erase(szotar.begin(), szotar.end()); // Minden elem törlése
std::map
-benfor
ciklussal:
for (const auto& : szotar) {
std::cout << kulcs << " -> " << ertek << std::endl;
}
Hagyományos iterátorral:
for (auto it = szotar.begin(); it != szotar.end(); ++it) {
std::cout << it->first << " -> " << it->second << std::endl;
}
Méret lekérése:
std::cout << "Elemek száma: " << szotar.size() << std::endl;
Üresség ellenőrzése:
if (szotar.empty()) {
std::cout << "A map üres!" << std::endl;
}
Teljes törlés:
szotar.clear();
A std::map
alapértelmezés szerint növekvő sorrendben rendezi a kulcsokat. Egyedi rendezési feltételt megadhatunk egy komparátorral:
struct ForditottRendezes {
bool operator()(int a, int b) const {
return a > b; // Csökkenő sorrend
}
};
std::map<int, std::string, ForditottRendezes> forditottSzotar;
A std::map
egy hatékony és rugalmas tároló, amely rendezett kulcs-érték párokat tartalmaz, és a legfontosabb műveleteket (O(\log n) idő alatt hajtja végre. Használata előnyös, ha gyors keresésre, beszúrásra vagy törlésre van szükség, miközben meg szeretnénk őrizni a kulcsok sorrendjét.