Térkép be C++ Szabványos sablonkönyvtár (STL)

⚡ Okos összefoglaló

Térkép be C++ egy asszociatív konténer a Standard Template Library-ből, amely rendezett kulcs-érték párokként tárolja az elemeket, ahol minden egyedi kulcs egy értékhez tartozik, és lehetővé teszi a gyors keresést, beszúrást és rendezett bejárást.

  • 🗺️ Asszociatív konténer: A C++ A map az elemeket kulcs-érték párokként tárolja, egyedi, automatikusan rendezett kulcsokkal.
  • 🧩 Fejléc és szintaxis: Illeszd be a map fejlécet, majd deklaráld az std::map-et név a beírt párok tárolására.
  • 🇧🇷 Beépített függvények: A begin(), size(), empty(), insert(), find(), erase() és clear() függvények kezelik a térkép tartalmát.
  • 🔄 Ismétlés: Egy kétirányú iterátor rendezett kulcssorrendben végigvezeti a térkép elemeit olvasás vagy törlés céljából.
  • 🔑 Egyedi kulcsok: Két elem nem használhat közös kulcsot, így egy map ideális asszociatív tömbként.
  • 🤖 AI segítség: A GitHub Copilot és hasonló mesterséges intelligencia asszisztensek egy rövid megjegyzésből építik fel a térképdeklarációkat és a ciklusokat.

Térkép be C++ STL

Miben van a térkép C++?

In C++A MAP egy asszociatív konténer, amely leképezett formában tárolja az elemeket. A leképezés minden eleme egy kulcsértékből és egy leképezett értékből áll. Két leképezett érték nem rendelkezhet ugyanazzal a kulcsértékkel.

A kulcsértékek hasznosak az elemek egyedi rendezéséhez és azonosításához, míg a leképezett értékek az egyes kulcsokhoz társított tartalmat tárolják. A kettő típusban eltérhet, de a tagtípus egy olyan párrá egyesíti őket, amely mindkettőt tartalmazza.

Mielőtt bármilyen kódot írnánk, érdemes megérteni, miért a térkép a megfelelő tárolóeszköz.

Miért használja az std::map-et?

Íme néhány ok a térkép használatára:

  • Az std::map csak az egyedi kulcsokat tárolja, rendezett sorrendben a kiválasztott rendezési feltételek alapján.
  • A kulcs segítségével egyszerű és gyors az elemek keresése.
  • Minden kulcshoz csak egy elem van rögzítve.
  • Az std::map asszociatív tömbként használható.
  • Az std::map kiegyensúlyozott bináris fák segítségével valósítható meg.

Ezen előnyök kihasználásához kezdjük a deklarációs szintaxissal.

Szintaxis

Az std::map deklarálásához használja a következő szintaxist:

std::map<key_datatype, value_datatype>map_name; 
  • Az kulcs_adattípus a térképkulcsok adattípusát jelöli.
  • Az érték_adattípus a leképezési kulcsoknak megfelelő értékek adattípusát jelöli.
  • Az térkép_neve a térkép neve.

Például:

map<string, int> my_map; 

Deklaráltunk egy my_map nevű map-et. A map kulcs adattípusa egy karakterlánc, érték adattípusa pedig egy egész szám lesz.

Tagtípusok

A tagfüggvények a következő tagtípusokat használhatják paraméterként vagy visszatérési típusként:

  • key_type: Kulcs (a sablon első paramétere)
  • mapped_type: T (a sablon második paramétere)
  • key_compare: Összehasonlítás (a sablon harmadik paramétere)
  • allocator_type: Alloc (a sablon negyedik paramétere)
  • érték tipusa: pár
  • value_compare: Beágyazott függvényosztály az elemek összehasonlításához
  • referencia: allocator_type::reference
  • const_reference: allocator_type::const_reference
  • mutató: allocator_type::pointer
  • const_pointer: allocator_type::const_pointer
  • iterátor: egy kétirányú iterátor az érték_típushoz
  • const_iterator: egy kétirányú iterátor a const érték_típushoz
  • reverse_iterator: egy fordított iterátor
  • const_reverse_iterator: állandó fordított iterátor
  • differencia_típus: ptrdiff_t
  • méret típus: méret_t

Az std::map beépített funkciói

Az std::map beépített funkciókkal rendelkezik. Ezek közül néhány a következőket tartalmazza:

  • kezdődik () – Ez a függvény az iterátort a térkép első elemére adja vissza.
  • méret () – Ez a függvény visszaadja a térképen található elemek számát.
  • üres() – Ez a függvény egy logikai értéket ad vissza, amely jelzi, hogy egy map üres-e.
  • beszúr(pár(kulcs, érték)) – Ez a függvény egy új kulcs-érték párt szúr be egy térképbe.
  • keres(érték) – Ez a függvény visszaadja a val elem iterátorát, ha az megtalálható. Egyébként m.end() értéket ad vissza.
  • törlés (iterátor pozíció) – Ez a függvény törli az iterátor által mutatott pozícióban lévő elemet.
  • törlés (konst g) – Ez a függvény törli a g kulcs-értéket egy leképezésből.
  • egyértelmű() – Ez a függvény az összes elemet törli a térképről.

A definiált függvények után a következő példák az iterációval kezdve működésbe hozzák őket.

Iteráció a térképelemeken keresztül

Végig iterálhatsz a térkép elemein. Ehhez egyszerűen létre kell hoznunk egy iterátort, és azt kell használnunk. Például:

Példa 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;
	}
}

output:

C++ térkép iteráció 1. példa kimenet

Itt van egy képernyőkép a kódról:

C++ térkép iteráció 1. példa kód

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be a karakterlánc-fejlécfájlt a kódunkba, hogy használni tudja a funkcióit.
  3. Szerelje be a térképfejléc fájlt a kódunkba a funkcióinak használatához.
  4. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  5. Hívja meg a main() függvényt. A { a függvény törzsének kezdetét jelöli.
  6. Hozzon létre egy Tanulók nevű térképet, ahol a kulcsok egész számok, az értékek pedig karakterláncok lesznek.
  7. Szúrjon be értékeket a térképre Diákok. Egy 200-as kulcs és egy Alice érték bekerül a térképbe.
  8. Szúrjon be értékeket a térképre Diákok. A 201-es kulcs és a János értéke bekerül a térképbe.
  9. Használd a size() függvényt a Students nevű térkép méretének lekéréséhez. Ennek 2-es értéket kell visszaadnia.
  10. Nyomtasson szöveget a konzolra.
  11. A for ciklus segítségével hozzon létre egy iterátort, amely a Tanulók nevű térkép elemei felett iterál.
  12. Nyomtassa ki a Diákok térkép értékeit a konzolon.
  13. A for ciklus törzsének vége.
  14. A main() függvény törzsének vége.

Adatok beszúrása std::map-be

Az std::map függvénybe az insert() függvénnyel vihet be elemeket. Ne feledje, hogy az std::map kulcsoknak egyedieknek kell lenniük.

Tehát először ellenőrzi, hogy az egyes kulcsok jelen vannak-e a térképen. Ha jelen vannak, a bejegyzés nem kerül beszúrásra, de visszaadja a meglévő bejegyzés iterátorát. Ha nincs jelen, akkor a bejegyzés beszúrásra kerül.

A függvénynek a következő változatai vannak:

  • beszúrás(pár) – ennél a variációnál egy kulcs-érték párt illesztenek be a térképbe.
  • beszúrás(kezdő_szám, vég_szám) – ennél a változatnál a bejegyzések egy másik map start_itr és end_itr által meghatározott tartományon belül lesznek beszúrva.

Az insert_or_assign() függvény ugyanúgy működik, mint az insert() függvény, de ha a megadott kulcs már létezik a map-ben, akkor az értéke módosul.

Példa 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;
}

output:

C++ térkép beszúrása 2. példa kimenet

Itt van egy képernyőkép a kódról:

C++ térkép beszúrás 2. példa kód

Code Magyarázat:

  1. Szerelje be a térképfejléc fájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  3. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  4. Hívja meg a main() függvényt. A { a függvény törzsének kezdetét jelöli.
  5. Hozzon létre egy m nevű térképet, ahol a kulcsok egész számok, az értékek pedig egész számok lesznek. Három bejegyzés került a térképre.
  6. Szúrjon be egy új bejegyzést a térképre m. Egy 5-ös kulcs és egy 6-os érték kerül beillesztésre a térképbe.
  7. Megpróbál belépni egy már meglévő kulcsba. Mivel az 1-es kulcs már létezik a térképen, a bejegyzés nem történik meg.
  8. Az insert_or_assign() függvény használata egy meglévő bejegyzés beszúrásához vagy módosításához. Mivel az 1-es kulcs már létezik, az értéke 6-ra változik.
  9. Nyomtasson szöveget a konzolra. A „\t” karakter vízszintes szóközt hoz létre, míg a „\n” karakter a következő sorra mozgatja az egérkurzort.
  10. Használat hurokhoz itr nevű iterátor létrehozásához a térkép m nevű elemei feletti iterációhoz.
  11. Nyomtassa ki a térkép m értékeit a konzolon. A „\t” karakter vízszintes szóközt hoz létre az egyes billentyűk és a megfelelő érték között. Ezzel szemben a „\n” karakter minden iteráció után a következő sorra mozgatja az egérkurzort.
  12. A for ciklus törzsének vége.
  13. A programnak értéket kell visszaadnia a sikeres befejezés után.
  14. A main() függvény törzsének vége.

Keresés a térképen

A find() függvénnyel kulcsok alapján kereshetünk elemeket egy map-ben. Ha a kulcs nem található, a függvény std::map::end értéket ad vissza. Ellenkező esetben a keresett elem egy iterátorát adja vissza.

Példa 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';
	}
}

output:

C++ térkép keresés keresés 3. példa kimenet

Itt van egy képernyőkép a kódról:

C++ térkép keresés keresés 3. példa kód

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba, hogy hiba nélkül használhassa funkcióit.
  2. Szerelje be a karakterlánc-fejlécfájlt a kódunkba, hogy hiba nélkül használhassa funkcióit.
  3. Szerelje be a térképfejléc fájlt a kódunkba, hogy hiba nélkül használhassa funkcióit.
  4. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  5. Hívd meg a main() függvényt. A { a main() függvény törzsének kezdetét jelöli.
  6. Hozzon létre egy Tanulók nevű térképet, amelynek kulcsai egész számok és értékláncok lesznek.
  7. Szúrjon be értékeket a térképre Diákok. Egy 200-as kulcs és egy Alice érték bekerül a térképbe.
  8. Szúrjon be értékeket a térképre Diákok. A 201-es kulcs és a János értéke bekerül a térképbe.
  9. Keresse meg a 201-es kulcshoz tartozó értéket.
  10. Használjon if utasítást annak ellenőrzésére, hogy a kulcs értéke megtalálható-e.
  11. Nyomtassa ki a kulcs értékét néhány szöveg mellé a konzolon.
  12. Az if utasítás törzsének vége.
  13. A main() függvény törzsének vége.

Adatok törlése a térképről

Az erase() függvénnyel törölhetünk egy értéket egy map-ből. Egyszerűen létrehozunk egy iterátort, amely a törlendő elemre mutat. Az iterátort ezután átadjuk az erase() függvénynek.

Példa 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;
}

output:

C++ térkép törlés törlés 4. példa kimenet

Itt van egy képernyőkép a kódról:

C++ térkép törlés törlés 4. példa kód

Code Magyarázat:

  1. Szerelje be az iostream fejlécfájlt a kódunkba a funkcióinak használatához.
  2. Szerelje be a karakterlánc-fejlécfájlt a kódunkba, hogy használni tudja a funkcióit.
  3. Szerelje be a térképfejléc fájlt a kódunkba a funkcióinak használatához.
  4. Szerelje be az std névteret a kódunkba, hogy az osztályait hívás nélkül használhassa.
  5. Hívd meg a main() függvényt. A { a main() függvény törzsének kezdetét jelöli.
  6. Hozzon létre egy térképet my_map néven, amelynek kulcsai karakterláncok és értékek egész számok lesznek.
  7. Értékek beszúrása a my_map térképbe. A Cow kulcs és az 1 érték bekerül a térképbe.
  8. Értékek beszúrása a my_map térképbe. A Cat kulcs és a 2 érték bekerül a térképbe.
  9. Adjon hozzá egy 3-as értéket a my_map térképhez egy oroszlánkulccsal.
  10. Hozzon létre egy iterátort a térképen való iterációhoz a my_map a kulcsmacskát keresve.
  11. Törölje az iterátor által mutatott elemet.
  12. Használj egy iterátort a my_map map elemeinek végigjárására az elejétől a végéig.
  13. Nyomtassa ki a térkép my_map tartalmát a konzolon.
  14. Sikeres befejezés után a programnak vissza kell adnia a kimenetet.
  15. A main() függvény törzsének vége.

GYIK

Az std::map egy önkiegyenlítő bináris keresőfa segítségével rendezi a kulcsokat, O(log n) műveleteket eredményezve. Az std::unordered_map egy hash táblát használ az átlagos O(1) kereséshez, de a kulcsokat nem sorrendben tárolja. Válasszon a rendezési igényei alapján.

Egy std::map jellemzően egy önkiegyensúlyozó bináris keresőfaként van megvalósítva, leggyakrabban egy piros-fekete fa. Ez rendezett sorrendben tartja a kulcsokat, és logaritmikus időt garantál a beszúrás, törlés és keresési műveletekhez.

Nem. Az std::map csak egyedi kulcsokat tartalmaz, így egy meglévő kulcs beszúrása nem írja felül azt. Ha duplikált kulcsokra van szükség, használja az std::multimap függvényt, amely lehetővé teszi, hogy több elem ugyanazt a kulcsértéket használja.

A map_name[key] használatával olvashatunk vagy rendelhetünk hozzá értéket; az alsó index operátor egy alapértelmezett bejegyzést szúr be, ha a kulcs hiányzik. Az at() tag kivételt dob ​​a hiányzó kulcsok esetén, így biztonságosabb választás.

Adjon át egy egyéni összehasonlítót harmadik sablonargumentumként, például std::map >. A nagyobb komparátor a kulcsokat a legmagasabbtól a legalacsonyabbig rendezi az alapértelmezett növekvő sorrend helyett.

Az std::map kulcs-érték párokat tárol, és kulcsonként keresi ki az értékeket, míg az std::set csak egyedi, érték nélküli kulcsokat tárol. Mindkettő rendezetten tartja az elemeket, de a map minden kulcshoz adatokat társít.

Igen. A mesterséges intelligencia által fejlesztett kódolási asszisztensek egy rövid promptot vagy megjegyzést működő std::map kóddá alakítanak, beleértve a deklarációkat, az insert hívásokat és az iterátor ciklusokat. Fordítás előtt mindig tekintsd át a generált kulcstípusokat, a sorrendet és a szélső eseteket.

Igen. GitHub másodpilóta Gépelés közben map deklarációkat, insert és find hívásokat, valamint iterációs ciklusokat javasol. Jól kezeli az ismétlődő sablonszövegeket, bár a fordítás előtt továbbra is ellenőrizni kell a kulcsok egyediségét és logikáját.

Foglald össze ezt a bejegyzést a következőképpen: