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_datatypeoznačuje datový typ mapových klíčů. - Jedno
value_datatypeoznačuje datový typ hodnot odpovídajících mapovacím klíčům. - Jedno
map_nameje 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:
Code Vysvětlení:
- 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:
Code Vysvětlení:
- 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:
Code Vysvětlení:
- 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:
Code Vysvětlení:
- 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.






