Mapa v C++ Standardní knihovna šablon (STL)

⚡ Chytré shrnutí

Mapa v C++ je asociativní kontejner ze standardní knihovny šablon, který ukládá prvky jako seřazené páry klíč-hodnota, kde každý jedinečný klíč se mapuje na jednu hodnotu a umožňuje rychlé vyhledávání, vkládání a uspořádané procházení.

  • 🗺️ Asociativní kontejner: A C++ Map ukládá položky jako páry klíč-hodnota s unikátními, automaticky seřazenými klíči.
  • 🧩 Záhlaví a syntaxe: Zahrňte hlavičku mapy a poté deklarujte std::map název pro ukládání párů typů.
  • 🛠️ Vestavěné funkce: Funkce begin(), size(), empty(), insert(), find(), erase() a clear() spravují obsah mapy.
  • 🔄 Opakování: Obousměrný iterátor prochází prvky mapy v seřazeném pořadí klíčů pro čtení nebo mazání.
  • 🔑 Unikátní klíče: Dva prvky nemohou sdílet klíč, což z mapy dělá ideální asociativní pole.
  • 🤖 Asistence AI: GitHub Copilot a podobní AI asistenti vytvářejí deklarace map a smyčky z krátkého komentáře.

Mapa v C++ STL

V čem je mapa C++?

In C++MAP je asociativní kontejner ukládající položky v mapované formě. Každá položka v mapě se skládá z klíčové hodnoty a mapované hodnoty. Dvě mapované hodnoty nemohou sdílet stejné klíčové hodnoty.

Hodnoty klíčů jsou užitečné pro jedinečné třídění a identifikaci prvků, zatímco mapované hodnoty ukládají obsah spojený s každým klíčem. Tyto dva se mohou lišit typem, ale typ člena je kombinuje do páru, který obsahuje oba.

Než začnete psát jakýkoli kód, je užitečné vědět, proč je mapa často tím správným kontejnerem, po kterém sáhnout.

Proč používat std::map?

Zde jsou důvody pro použití mapy:

  • std::map ukládá pouze unikátní klíče, seřazené podle zvolených kritérií řazení.
  • Vyhledávání prvků pomocí klíče je snadné a rychlé.
  • 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í vyvážených binárních stromů.

Abyste tyto výhody využili, začněte se syntaxí deklarace.

Syntax

Chcete-li deklarovat std::map, použijte tuto syntaxi:

std::map<key_datatype, value_datatype>map_name; 
  • Jedno typ_dat_klíče označuje datový typ mapových klíčů.
  • Jedno datový_typ_hodnoty označuje datový typ hodnot odpovídajících mapovacím klíčům.
  • Jedno název_mapy je název mapy.

Například:

map<string, int> my_map; 

Deklarovali jsme mapu s názvem my_map. Mapa bude mít jako datový typ klíče řetězec a jako datový typ hodnoty celé číslo.

Typy členů

Členské funkce mohou používat následující typy členů buď jako parametry, nebo jako 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 vrací iterátor na první položku mapy.
  • velikost() – Tato funkce vrací počet položek v mapě.
  • prázdný() – Tato funkce vrací booleovskou hodnotu označující, zda je mapa prázdná.
  • vložit(pár(klíč, hodnota)) – Tato funkce vloží nový pár klíč-hodnota do mapy.
  • najít(hodnota) – Tato funkce vrátí iterátor elementu val, pokud je nalezen. V opačném případě vrátí m.end().
  • erase(pozice iterátoru) – Tato funkce smaže položku na pozici, na kterou ukazuje iterátor.
  • vymazat (konst g) – Tato funkce odstraní klíč-hodnotu g z mapy.
  • Průhledná() – Tato funkce odstraní všechny položky z mapy.

Po definovaných funkcích je následující příklady uvedou do praxe, počínaje iterací.

Iterace přes prvky mapy

Můžete iterovat přes prvky mapy. Stačí vytvořit iterátor a použít ho 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:

C++ výstup příkladu 1 iterace mapy

Zde je snímek obrazovky kódu:

C++ Příklad 1 kódu iterace mapy

Code Vysvětlení:

  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 funkci main(). { 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. Pomocí funkce size() získejte velikost mapy s názvem Students. Mělo by se vrátit číslo 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 funkce main().

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

Položky můžete do std::map vkládat pomocí funkce insert(). Nezapomeňte, že klíče std::map musí být jedinečné.

Nejprve tedy zkontroluje, zda je každý klíč v mapě přítomen. Pokud ano, položka se nevloží, ale vrátí iterátor pro existující položku. Pokud přítomen není, položka se vloží.

Funkce má následující varianty:

  • vložit (párovat) – s touto variantou je do mapy vložen pár klíč-hodnota.
  • vložit(počáteční_itr, koncový_itr) – s touto variantou budou položky vloženy do rozsahu definovaného parametry start_itr a end_itr z jiné mapy.

Funkce insert_or_assign() funguje stejným způsobem jako funkce insert(), ale pokud daný klíč již v mapě existuje, jeho hodnota bude 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:

C++ vložení mapy Příklad 2 výstup

Zde je snímek obrazovky kódu:

C++ Příklad 2 kódu pro vložení mapy

Code Vysvětlení:

  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 funkci main(). { 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. Použití funkce insert_or_assign() 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 funkce main().

Vyhledávání v mapě

Funkci find() můžeme použít k vyhledávání prvků v mapě podle jejich klíčů. Pokud klíč není nalezen, funkce vrátí hodnotu std::map::end. V opačném případě vrátí 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:

C++ mapa najít hledání Příklad 3 výstup

Zde je snímek obrazovky kódu:

C++ mapa najít hledání Příklad 3 kód

Code Vysvětlení:

  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 funkci main(). Znak { označuje začátek těla funkce main().
  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 funkce main().

Vymazání dat z mapy

Funkci erase() můžeme použít k odstranění hodnoty z mapy. Jednoduše vytvoříme iterátor, který ukazuje na prvek, který má být odstraněn. Iterátor se poté předá funkci erase().

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:

C++ smazání mapy smazání Příklad 4 výstup

Zde je snímek obrazovky kódu:

C++ Příklad 4 kódu pro vymazání mapy

Code Vysvětlení:

  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 funkci main(). Znak { označuje začátek těla funkce main().
  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 funkce main().

Nejčastější dotazy

std::map uchovává klíče seřazené pomocí samovyvažovacího binárního vyhledávacího stromu, což umožňuje O(log n) operací. std::unordered_map používá hašovací tabulku pro průměrné vyhledávání O(1), ale ukládá klíče v libovolném pořadí. Vyberte si podle svých potřeb.

std::map je obvykle implementován jako samovyvažovací binární vyhledávací strom, nejčastěji červeno-černý strom. To udržuje klíče v seřazeném pořadí a zaručuje logaritmický čas pro operace vkládání, mazání a vyhledávání.

Ne. std::map obsahuje pouze unikátní klíče, takže vložení existujícího klíče jej nepřepíše. Pokud jsou vyžadovány duplicitní klíče, použijte std::multimap, který umožňuje více prvkům sdílet stejnou hodnotu klíče.

Pro čtení nebo přiřazení hodnoty použijte map_name[key]; operátor dolního indexu vloží výchozí položku, pokud klíč chybí. Člen at() vyvolá výjimku pro chybějící klíče, což z něj činí bezpečnější volbu.

Jako třetí argument šablony předejte vlastní komparátor, například std::map >. Větší komparátor seřazuje klíče od nejvyšší po nejnižší namísto výchozího vzestupného pořadí.

std::map ukládá páry klíč-hodnota a vyhledává hodnoty podle klíče, zatímco std::set ukládá pouze jedinečné klíče bez přidružené hodnoty. Oba uchovávají prvky seřazené, ale map přiřazuje data ke každému klíči.

Ano. Asistenti kódování s umělou inteligencí přemění krátkou prompt nebo komentář na funkční kód std::map, včetně deklarací, volání insertů a iteračních cyklů. Před kompilací vždy zkontrolujte vygenerované typy klíčů, jejich pořadí a hraniční případy.

Ano. GitHub Copilot Navrhuje deklarace map, volání funkcí insert a find a iterační smyčky během psaní. Zvládá dobře opakující se standardizované postupy, i když byste si před sestavením měli ověřit jedinečnost a logiku klíčů.

Shrňte tento příspěvek takto: