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:

Iterace přes prvky mapy

Zde je snímek obrazovky kódu:

Iterace přes prvky mapy

Vysvětlení kódu:

  1. Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
  2. Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor řetězce.
  3. Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví mapy.
  4. Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
  5. Zavolejte main() funkce. { označuje začátek těla funkce.
  6. Vytvořte mapu s názvem Studenti, kde klíče budou celá čísla a hodnoty budou řetězce.
  7. Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 200 a hodnota Alice.
  8. Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 201 a hodnota John.
  9. Použití size() funkce pro získání velikosti mapy s názvem Studenti. To by mělo vrátit 2.
  10. Vytiskněte nějaký text na konzoli.
  11. Pomocí cyklu for vytvořte iterátor pojmenovaný pro iteraci prvků mapy s názvem Studenti.
  12. Vytiskněte hodnoty mapy Studenti na konzoli.
  13. Konec těla smyčky for.
  14. 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:

Vkládání dat do std::map

Zde je snímek obrazovky kódu:

Vkládání dat do std::map

Vysvětlení kódu:

  1. Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví mapy.
  2. Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
  3. Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
  4. Zavolejte main() funkce. { označuje začátek těla funkce.
  5. 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.
  6. Vložit nový záznam do mapy m. Do mapy bude vložen klíč 5 a hodnota 6.
  7. Pokus o zadání do již existujícího klíče. Protože klíč 1 již na mapě existuje, nebude záznam proveden.
  8. 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.
  9. Vytiskněte nějaký text na konzoli. Znak „\t“ vytváří vodorovnou mezeru, zatímco znak „\n“ přesune kurzor myši na další řádek.
  10. Použití pro smyčku vytvořit iterátor s názvem itr pro iteraci prvků mapy s názvem m.
  11. 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.
  12. Konec těla smyčky for.
  13. Program musí po úspěšném dokončení vrátit hodnotu.
  14. 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:

Vyhledávání v mapě

Zde je snímek obrazovky kódu:

Vyhledávání v mapě

Vysvětlení kódu:

  1. Zahrňte hlavičkový soubor iostream do našeho kódu, abyste mohli používat jeho funkce bez chyb.
  2. Zahrňte do našeho kódu soubor záhlaví řetězce, abyste mohli používat jeho funkce bez chyb.
  3. Zahrňte do našeho kódu soubor záhlaví mapy, abyste mohli používat jeho funkce bez chyb.
  4. Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
  5. Zavolejte main() funkce. { označuje začátek těla main() funkce.
  6. Vytvořte mapu s názvem Studenti, jejíž klíče budou celá čísla a řetězce hodnot.
  7. Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 200 a hodnota Alice.
  8. Vložte hodnoty do mapy Studenti. Do mapy bude vložen klíč 201 a hodnota John.
  9. Hledejte hodnotu spojenou s klíčem 201.
  10. Pomocí příkazu if zkontrolujte, zda je nalezena hodnota klíče.
  11. Vytiskněte hodnotu klíče vedle nějakého textu na konzole.
  12. Konec těla příkazu if.
  13. 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:

Vymazání dat z mapy

Zde je snímek obrazovky kódu:

Vymazání dat z mapy

Vysvětlení kódu:

  1. Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor iostream.
  2. Chcete-li používat jeho funkce, zahrňte do našeho kódu hlavičkový soubor řetězce.
  3. Chcete-li používat jeho funkce, zahrňte do našeho kódu soubor záhlaví mapy.
  4. Zahrňte jmenný prostor std do našeho kódu, abyste mohli používat jeho třídy bez jeho volání.
  5. Zavolejte main() funkce. { označuje začátek těla souboru main() funkce.
  6. Vytvořte mapu s názvem moje_mapa, jejíž klíče budou řetězce a hodnoty celá čísla.
  7. Vložte hodnoty do mapy moje_mapa. Do mapy bude vložen klíč Cow a hodnota 1.
  8. Vložte hodnoty do mapy moje_mapa. Do mapy bude vložen klíč Cat a hodnota 2.
  9. Přidejte hodnotu 3 do mapy my_map pomocí klíče lva.
  10. Vytvořte iterátor, který bude iterovat mapu my_map a hledat klíčovou kočku.
  11. Odstraňte prvek, na který ukazuje iterátor.
  12. Použijte iterátor k iteraci prvků mapy my_map od začátku do konce.
  13. Vytiskněte obsah mapy my_map na konzoli.
  14. Program musí po úspěšném dokončení vrátit výstup.
  15. 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.