Mapa v C++ Standardní knihovna šablon (STL)
V čem je mapa C++? Syntax
In C++, je MAP je asociativní kontejner ukládající položky v mapované podobě. Každá položka na mapě se skládá z páru klíč–hodnota a namapované hodnoty. Dvě namapované hodnoty nemohou sdílet stejné klíčové hodnoty.
Klíčové hodnoty jsou dobré pro jednoznačné třídění a identifikaci prvků. Mapované hodnoty jsou pro ukládání obsahu spojeného s klíčem. Tyto dva se mohou lišit v typech, ale typ člena je kombinuje prostřednictvím párového typu, který kombinuje oba.
Proč používat std::map?
Zde jsou důvody pro použití mapy:
- std:: mapa ukládá jedinečné klíče pouze v seřazeném pořadí na základě zvolených třídicích kritérií.
- Vyhledání prvků pomocí klíče je snadné a rychlejší.
- Ke každému klíči je připojen pouze jeden prvek.
- std::map lze použít jako asociativní pole.
- std::map je implementovatelný pomocí binárních stromů (vyvážený).
Syntax
Chcete-li deklarovat std::map, použijte tuto syntaxi:
std::map<key_datatype, value_datatype>map_name;
- Jedno
key_datatype
označuje datový typ mapových klíčů. - Jedno
value_datatype
označuje datový typ hodnot odpovídajících mapovacím klíčům. - Jedno
map_name
je název mapy.
Například:
map<string, int> my_map;
Vyhlásili jsme mapu jménem my_map
. Mapa bude mít řetězec as klíč datové typy a celé číslo jako hodnoty datový typ.
Typy členů
Členské funkce mohou používat následující typy členů jako parametry nebo návratový typ:
- key_type: Klíč (první parametr v šabloně)
- mapovaný_typ: T (druhý parametr v šabloně)
- key_compare: Porovnat (třetí parametr v šabloně)
- alokátor_typ: Alloc (čtvrtý parametr v šabloně)
- typ hodnoty: pár
- value_compare: Vnořená třída funkce pro porovnávání prvků
- odkaz: alokátor_typ::odkaz
- const_reference: alokátor_typ::const_reference
- ukazatel: alokátor_typ::ukazatel
- const_pointer: alokátor_typ::const_pointer
- iterátor: obousměrný iterátor na typ_hodnoty
- const_iterator: obousměrný iterátor na const value_type
- reverzní_iterátor: reverzní iterátor
- const_reverse_iterator: konstantní reverzní iterátor
- rozdíl_typ: ptrdiff_t
- size_type: size_t
Vestavěné funkce std::map
std::map přichází s vestavěnými funkcemi. Některé z nich zahrnují:
- začít() – Tato funkce vrátí iterátor na první položku mapy.
- velikost () –Tato funkce vrací počet položek v mapě.
- empty() –Tato funkce vrací booleovskou hodnotu označující, zda je mapa prázdná.
- insert( pair(key, value)) – Tato funkce vloží do mapy nový pár klíč–hodnota.
- najít(val) – Tato funkce poskytuje iterátor prvku val, pokud je nalezen. V opačném případě vrátí m.end().
- Vymazat (pozice iterátoru) – Tato funkce odstraní položku na pozici, na kterou ukazuje iterátor.
- vymazat (konst g) – Tato funkce odstraní klíč–hodnota g z mapy.
- Průhledná () -Tato funkce odstraní všechny položky z mapy.
Iterace přes prvky mapy
Přes prvky mapy můžete iterovat. Musíme jednoduše vytvořit iterátor a použít jej k tomu.
Například:
Příklad 1:
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); cout << "Map size is: " << Students.size() << endl; cout << endl << "Default map Order is: " << endl; for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) { cout << (*it).first << ": " << (*it).second << endl; } }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor řetězce.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví mapy.
- Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte
main()
funkce. { označuje začátek těla funkce. - Vytvořte mapu s názvem Studenti, kde klíče budou celá čísla a hodnoty budou řetězce.
- Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 200 a hodnota Alice.
- Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 201 a hodnota John.
- Použití
size()
funkce pro získání velikosti mapy s názvem Studenti. To by mělo vrátit 2. - Vytiskněte nějaký text na konzoli.
- Pomocí cyklu for vytvořte iterátor pojmenovaný pro iteraci prvků mapy s názvem Studenti.
- Vytiskněte hodnoty mapy Studenti na konzoli.
- Konec těla smyčky for.
- Konec těla
main()
funkce.
Vkládání dat do std::map
Položky můžete zadávat do std::map pomocí insert()
funkce. Pamatujte, že klíče std::map musí být jedinečné.
Nejprve tedy zkontroluje, zda je v mapě přítomen každý klíč. Pokud je přítomen, položka nebude vložena, ale vrátí iterátor pro existující položku. Pokud není přítomen, záznam se vloží.
Funkce má následující varianty:
- vložit (pár) – s touto variantou se do mapy vloží pár klíč-hodnota.
- insert(start_itr, end_itr) – s touto variantou budou položky vloženy do rozsahu definovaného pomocí start_itr a end_itr z jiné mapy.
Jedno insert_or_assing() funkce funguje stejným způsobem jako insert()
funkce, ale pokud daný klíč již v mapě existuje, bude jeho hodnota upravena.
Příklad 2:
#include <map> #include <iostream> using namespace std; int main() { map<int, int> m{ {1,3} , {2,4} , {3,5} }; m.insert({ 5, 6 }); m.insert({ 1, 8 }); m.insert_or_assign(1, 6); cout << "Key\tElement\n"; for (auto itr = m.begin(); itr != m.end(); ++itr) { cout << itr->first << '\t' << itr->second << '\n'; } return 0; }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví mapy.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
- Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte
main()
funkce. { označuje začátek těla funkce. - Vytvořte mapu s názvem m, kde klíče budou celá čísla a hodnoty budou celá čísla. Do mapy byly provedeny tři záznamy.
- Vložit nový záznam do mapy m. Do mapy bude vložen klíč 5 a hodnota 6.
- Pokus o zadání do již existujícího klíče. Protože klíč 1 již na mapě existuje, nebude záznam proveden.
- Za použití
insert_or_assign()
funkce pro vložení nebo úpravu existující položky. Protože klíč 1 již existuje, jeho hodnota se změní na 6. - Vytiskněte nějaký text na konzoli. Znak „\t“ vytváří vodorovnou mezeru, zatímco znak „\n“ přesune kurzor myši na další řádek.
- Použití pro smyčku vytvořit iterátor s názvem itr pro iteraci prvků mapy s názvem m.
- Vytiskněte hodnoty mapy m na konzole. Znak „\t“ vytváří vodorovnou mezeru mezi každým klíčem a jeho odpovídající hodnotou. Naproti tomu znak „\n“ přesune kurzor myši na další řádek po každé iteraci.
- Konec těla smyčky for.
- Program musí po úspěšném dokončení vrátit hodnotu.
- Konec těla
main()
funkce.
Vyhledávání v mapě
Můžeme použít find()
funkce pro vyhledávání prvků na mapě pomocí jejich kláves. Pokud klíč není nalezen, funkce vrátí std::map::end. V opačném případě bude vrácen iterátor hledaného prvku.
Příklad 3:
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); std::map<int, string>::iterator it = Students.find(201); if (it != Students.end()) { std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n'; } }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Zahrňte hlavičkový soubor iostream do našeho kódu, abyste mohli používat jeho funkce bez chyb.
- Zahrňte do našeho kódu soubor záhlaví řetězce, abyste mohli používat jeho funkce bez chyb.
- Zahrňte do našeho kódu soubor záhlaví mapy, abyste mohli používat jeho funkce bez chyb.
- Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte
main()
funkce. { označuje začátek tělamain()
funkce. - Vytvořte mapu s názvem Studenti, jejíž klíče budou celá čísla a řetězce hodnot.
- Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 200 a hodnota Alice.
- Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 201 a hodnota John.
- Hledejte hodnotu spojenou s klíčem 201.
- Pomocí příkazu if zkontrolujte, zda je nalezena hodnota klíče.
- Vytiskněte hodnotu klíče vedle nějakého textu na konzole.
- Konec těla příkazu if.
- Konec těla
main()
funkce.
Vymazání dat z mapy
Můžeme použít erase()
funkce pro odstranění hodnoty z mapy. Jednoduše vytvoříme iterátor, který ukazuje na prvek, který má být odstraněn. Iterátor je poté předán do erase()
funkce.
Příklad 4:
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<std::string, int> my_map; my_map.insert(std::make_pair("cow", 1)); my_map.insert(std::make_pair("cat", 2)); my_map["lion"] = 3; map<std::string, int>::iterator it = my_map.find("cat"); my_map.erase(it); for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it) cout << (*it).first << ": " << (*it).second << endl; return 0; }
Výstup:
Zde je snímek obrazovky kódu:
Vysvětlení kódu:
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor řetězce.
- Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví mapy.
- Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
- Zavolejte
main()
funkce. { označuje začátek těla souborumain()
funkce. - Vytvořte mapu s názvem moje_mapa, jejíž klíče budou řetězce a hodnoty celá čísla.
- Vložte hodnoty do mapy moje_mapa. Do mapy bude vložen klíč Cow a hodnota 1.
- Vložte hodnoty do mapy moje_mapa. Do mapy bude vložen klíč Cat a hodnota 2.
- Přidejte hodnotu 3 do mapy my_map pomocí klíče lva.
- Vytvořte iterátor, který bude iterovat mapu my_map a hledat klíčovou kočku.
- Odstraňte prvek, na který ukazuje iterátor.
- Použijte iterátor k iteraci prvků mapy my_map od začátku do konce.
- Vytiskněte obsah mapy my_map na konzoli.
- Program musí po úspěšném dokončení vrátit výstup.
- Konec těla
main()
funkce.
Shrnutí
- Mapa je asociativní kontejner, který ukládá položky v mapované podobě.
- Každá položka na mapě má hodnotu klíče a namapovanou hodnotu.
- V mapě nemohou dvě namapované hodnoty sdílet klíčové hodnoty.
- Klíčové hodnoty pomáhají při jednoznačném třídění a identifikaci prvků.
- Namapované hodnoty pomáhají při ukládání obsahu spojeného s klíčem.
- C++ mapa ukládá jedinečné klíče v seřazeném pořadí.
- Pracovat s C++ map, vytvoříme iterátor pro iteraci prvků.
- Pomocí iterátoru můžeme provádět úkoly, jako je vyhledávání a mazání položek z mapy.