Kaart in C++ Standaardsjabloonbibliotheek (STL)

โšก Slimme samenvatting

Kaart in C++ is een associatieve container uit de Standard Template Library die elementen opslaat als gesorteerde sleutel-waardeparen, waarbij elke unieke sleutel aan รฉรฉn waarde is gekoppeld en snel opzoeken, invoegen en geordend doorlopen mogelijk maakt.

  • ๐Ÿ—บ๏ธ Associatieve container: A C++ De map slaat items op als sleutel-waardeparen met unieke, automatisch gesorteerde sleutels.
  • ๐Ÿงฉ Koptekst en syntaxis: Voeg de map-header toe en declareer vervolgens std::map naam om getypte paren in op te slaan.
  • ๏ธ Ingebouwde functies: begin(), size(), empty(), insert(), find(), erase() en clear() beheren de inhoud van een map.
  • ๐Ÿ”„ Iteratie: Een bidirectionele iterator doorloopt de elementen van een kaart in gesorteerde sleutelvolgorde om ze te lezen of te verwijderen.
  • ๐Ÿ”‘ Unieke sleutels: Twee elementen kunnen geen gemeenschappelijke sleutel hebben, waardoor een map ideaal is als associatieve array.
  • ๐Ÿค– AI-assistentie: GitHub Copilot en vergelijkbare AI-assistenten genereren kaartdeclaraties en lussen op basis van een korte opmerking.

Kaart in C++ STL

Wat is Kaart in C++?

In C++Een MAP is een associatieve container die items opslaat in een gemapte vorm. Elk item in de map bestaat uit een sleutelwaarde en een gemapte waarde. Twee gemapte waarden kunnen niet dezelfde sleutelwaarden hebben.

De sleutelwaarden zijn handig voor het sorteren en uniek identificeren van elementen, terwijl de gekoppelde waarden de inhoud opslaan die aan elke sleutel is gekoppeld. De twee kunnen verschillen in type, maar het lidtype combineert ze tot een paar dat beide bevat.

Voordat je code schrijft, is het handig om te weten waarom een โ€‹โ€‹map vaak de juiste container is om te gebruiken.

Waarom std::map gebruiken?

Hieronder volgen enkele redenen om een โ€‹โ€‹kaart te gebruiken:

  • std::map slaat alleen unieke sleutels op, gesorteerd op basis van de gekozen sorteercriteria.
  • Met behulp van de sleutel is het eenvoudig en snel om naar elementen te zoeken.
  • Aan elke sleutel is slechts รฉรฉn element bevestigd.
  • std::map kan worden gebruikt als een associatieve array.
  • std::map kan worden geรฏmplementeerd met behulp van gebalanceerde binaire bomen.

Om van deze voordelen te profiteren, begin je met de declaratiesyntaxis.

Syntaxis

Gebruik deze syntaxis om std::map te declareren:

std::map<key_datatype, value_datatype>map_name; 
  • De sleutel_datatype geeft het gegevenstype van de kaartsleutels aan.
  • De waarde_datatype geeft het gegevenstype aan van de waarden die overeenkomen met de kaartsleutels.
  • De mapnaam is de naam van de kaart.

Bijvoorbeeld:

map<string, int> my_map; 

We hebben een map met de naam my_map gedeclareerd. De sleutel van de map zal van het gegevenstype string zijn en de waarden van het gegevenstype integer.

Soorten leden

De lidfuncties kunnen de volgende lidtypen gebruiken als parameters of als retourtype:

  • sleutel type: Sleutel (de eerste parameter in de sjabloon)
  • toegewezen_type: T (de tweede parameter in de sjabloon)
  • key_compare: Vergelijk (de derde parameter in de sjabloon)
  • allocator_type: Toewijzen (de vierde parameter in de sjabloon)
  • waarde type: paar
  • waarde_vergelijk: Geneste functieklasse voor het vergelijken van elementen
  • referentie: allocator_type::referentie
  • const_referentie: allocator_type::const_referentie
  • wijzer: allocator_type::wijzer
  • const_pointer: allocator_type::const_pointer
  • iterator: een bidirectionele iterator voor het waarde_type
  • const_iterator: een bidirectionele iterator voor de const waarde_type
  • omgekeerde_iterator: een omgekeerde iterator
  • const_reverse_iterator: een constante omgekeerde iterator
  • verschiltype: ptrdiff_t
  • maat_type: maat_t

Ingebouwde functies van std::map

std::map wordt geleverd met ingebouwde functies. Sommige hiervan omvatten:

  • beginnen () Deze functie retourneert de iterator naar het eerste item van de map.
  • grootte() Deze functie retourneert het aantal items in een map.
  • leeg() Deze functie retourneert een Booleaanse waarde die aangeeft of een map leeg is.
  • invoegen(paar(sleutel, waarde)) Deze functie voegt een nieuw sleutel-waardepaar toe aan een map.
  • vind(waarde) โ€“ Deze functie geeft de iterator naar het element val terug als deze gevonden wordt. Anders retourneert de functie m.end().
  • wissen(iteratorpositie) Deze functie verwijdert het item op de positie waarnaar de iterator wijst.
  • wissen(const g) Deze functie verwijdert de sleutel-waardecombinatie g uit een map.
  • Doorzichtig() Deze functie verwijdert alle items uit een kaart.

Nadat de functies zijn gedefinieerd, worden ze in de volgende voorbeelden in de praktijk gebracht, te beginnen met iteratie.

Itereren over kaartelementen

Je kunt de elementen van de kaart doorlopen. We hoeven alleen maar een iterator te maken en die hiervoor te gebruiken. Bijvoorbeeld:

Voorbeeld 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++ kaartiteratie Voorbeeld 1 uitvoer

Hier is een screenshot van de code:

C++ Voorbeeldcode voor kaartiteratie (voorbeeld 1):

Code Uitleg:

  1. Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken.
  2. Neem het string-headerbestand op in onze code om de functies ervan te gebruiken.
  3. Neem het kaartheaderbestand op in onze code om de functies ervan te gebruiken.
  4. Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
  5. Roep de functie main() aan. De { markeert het begin van de hoofdtekst van de functie.
  6. Maak een kaart met de naam Studenten, waarbij de sleutels gehele getallen zijn en de waarden tekenreeksen.
  7. Waarden invoegen in de kaart Studenten. Een sleutel van 200 en een waarde van Alice worden in de kaart ingevoegd.
  8. Waarden invoegen in de kaart Studenten. Een sleutel van 201 en een waarde van John worden in de kaart ingevoegd.
  9. Gebruik de functie `size()` om de grootte van de kaart met de naam 'Students' te verkrijgen. Dit zou een 2 moeten retourneren.
  10. Druk wat tekst af op de console.
  11. Gebruik een for-lus om een โ€‹โ€‹iterator te maken met de naam Studenten, om de elementen van de kaart met de naam Studenten te doorlopen.
  12. Print de waarden van de kaart Studenten op de console.
  13. Einde van de hoofdtekst van de for-lus.
  14. Einde van de hoofdtekst van de functie main().

Gegevens invoegen in std::map

Je kunt items aan een `std::map` toevoegen met de functie `insert()`. Vergeet niet dat de sleutels in een `std::map` uniek moeten zijn.

Het controleert dus eerst of elke sleutel in de map aanwezig is. Als deze aanwezig is, wordt het item niet ingevoegd, maar wordt de iterator voor het bestaande item geretourneerd. Als deze niet aanwezig is, wordt het item ingevoegd.

De functie kent de volgende variaties:

  • invoegen(paar) โ€“ Bij deze variant wordt een sleutel-waardepaar in de kaart ingevoegd.
  • invoegen(start_itr, end_itr) โ€“ Bij deze variant worden de gegevens ingevoegd binnen het bereik dat is gedefinieerd door start_itr en end_itr uit een andere kaart.

De functie insert_or_assign() werkt op dezelfde manier als de functie insert(), maar als de opgegeven sleutel al in de map bestaat, wordt de waarde ervan aangepast.

Voorbeeld 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++ kaart invoegen Voorbeeld 2 uitvoer

Hier is een screenshot van de code:

C++ kaart invoegen Voorbeeld 2 code

Code Uitleg:

  1. Neem het kaartheaderbestand op in onze code om de functies ervan te gebruiken.
  2. Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken.
  3. Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
  4. Roep de functie main() aan. De { markeert het begin van de hoofdtekst van de functie.
  5. Maak een kaart met de naam m, waarbij de sleutels gehele getallen zijn en de waarden gehele getallen zijn. Er zijn drie vermeldingen op de kaart aangebracht.
  6. Voeg een nieuw item in de kaart in m. Een sleutel van 5 en een waarde van 6 worden in de kaart ingevoegd.
  7. Er wordt geprobeerd een invoer te maken in een reeds bestaande sleutel. Omdat sleutel 1 al op de kaart bestaat, wordt de invoer niet uitgevoerd.
  8. De functie insert_or_assign() gebruiken om een โ€‹โ€‹bestaande invoer in te voegen of te wijzigen. Omdat de sleutel 1 al bestaat, wordt de waarde ervan gewijzigd in 6.
  9. Druk wat tekst af op de console. Het teken โ€œ\tโ€ creรซert een horizontale spatie, terwijl het teken โ€œ\nโ€ de muiscursor naar de volgende regel verplaatst.
  10. Gebruik een for loop om een โ€‹โ€‹iterator met de naam itr te maken om de elementen van de kaart met de naam m te herhalen.
  11. Druk de waarden van de kaart m af op de console. Het teken โ€œ\tโ€ creรซert een horizontale spatie tussen elke toets en de bijbehorende waarde. Het teken โ€œ\nโ€ daarentegen verplaatst de muiscursor na elke iteratie naar de volgende regel.
  12. Einde van de hoofdtekst van de for-lus.
  13. Het programma moet bij succesvolle voltooiing een waarde retourneren.
  14. Einde van de hoofdtekst van de functie main().

Zoeken op een kaart

We kunnen de `find()`-functie gebruiken om elementen in een map te zoeken op basis van hun sleutels. Als de sleutel niet wordt gevonden, retourneert de functie `std::map::end`. Anders wordt een iterator van het gezochte element geretourneerd.

Voorbeeld 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++ kaart zoeken Voorbeeld 3 uitvoer

Hier is een screenshot van de code:

C++ kaart zoeken Voorbeeld 3 code

Code Uitleg:

  1. Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken zonder fouten te krijgen.
  2. Neem het string-headerbestand op in onze code om de functies ervan te gebruiken zonder fouten te krijgen.
  3. Neem het kaartheaderbestand op in onze code om de functies ervan te gebruiken zonder fouten te krijgen.
  4. Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
  5. Roep de functie main() aan. De { markeert het begin van de body van de functie main().
  6. Maak een kaart met de naam Studenten, waarvan de sleutels gehele getallen en waardenreeksen zijn.
  7. Waarden invoegen in de kaart Studenten. Een sleutel van 200 en een waarde van Alice worden in de kaart ingevoegd.
  8. Waarden invoegen in de kaart Studenten. Een sleutel van 201 en een waarde van John worden in de kaart ingevoegd.
  9. Zoek naar de waarde die is gekoppeld aan een sleutel van 201.
  10. Gebruik een if-statement om te controleren of de waarde voor de sleutel wordt gevonden.
  11. Druk de waarde van de sleutel af naast wat tekst op de console.
  12. Einde van de hoofdtekst van de if-instructie.
  13. Einde van de hoofdtekst van de functie main().

Gegevens van een kaart verwijderen

We kunnen de functie `erase()` gebruiken om een โ€‹โ€‹waarde uit een map te verwijderen. We maken simpelweg een iterator aan die naar het te verwijderen element wijst. Deze iterator wordt vervolgens doorgegeven aan de functie `erase()`.

Voorbeeld 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++ kaart wissen verwijderen Voorbeeld 4 uitvoer

Hier is een screenshot van de code:

C++ kaart wissen verwijderen Voorbeeld 4 code

Code Uitleg:

  1. Neem het iostream-headerbestand op in onze code om de functies ervan te gebruiken.
  2. Neem het string-headerbestand op in onze code om de functies ervan te gebruiken.
  3. Neem het kaartheaderbestand op in onze code om de functies ervan te gebruiken.
  4. Neem de std-naamruimte op in onze code om de klassen ervan te gebruiken zonder deze aan te roepen.
  5. Roep de functie main() aan. De { markeert het begin van de body van de functie main().
  6. Maak een kaart met de naam my_map, waarvan de sleutels strings en gehele waarden zijn.
  7. Voeg waarden in de kaart my_map in. Een sleutel Koe en een waarde van 1 worden in de kaart ingevoegd.
  8. Voeg waarden in de kaart my_map in. Een sleutel van Cat en een waarde van 2 worden in de kaart ingevoegd.
  9. Voeg een waarde 3 toe aan de kaart my_map met een sleutel van een leeuw.
  10. Maak een iterator om de kaart my_map te doorlopen op zoek naar de sleutelkat.
  11. Verwijder het element waarnaar de iterator verwijst.
  12. Gebruik een iterator om de elementen van de map my_map van begin tot eind te doorlopen.
  13. Druk de inhoud van de kaart my_map op de console af.
  14. Het programma moet uitvoer retourneren na succesvolle voltooiing.
  15. Einde van de hoofdtekst van de functie main().

Veelgestelde vragen

`std::map` houdt sleutels gesorteerd met behulp van een zelfbalancerende binaire zoekboom, wat resulteert in O(log n) bewerkingen. `std::unordered_map` gebruikt een hashtabel voor gemiddeld O(1) zoekopdrachten, maar slaat sleutels in willekeurige volgorde op. Kies op basis van uw sorteerbehoeften.

Een std::map wordt doorgaans geรฏmplementeerd als een zelfbalancerende binaire zoekboom, meestal een rood-zwarte boom. Hierdoor blijven de sleutels in gesorteerde volgorde en is een logaritmische tijdsduur gegarandeerd voor invoeg-, verwijder- en zoekbewerkingen.

Nee. Een `std::map` bevat alleen unieke sleutels, dus het invoegen van een bestaande sleutel overschrijft deze niet. Wanneer dubbele sleutels nodig zijn, gebruik dan `std::multimap`, waarmee meerdere elementen dezelfde sleutelwaarde kunnen delen.

Gebruik map_name[key] om een โ€‹โ€‹waarde te lezen of toe te wijzen; de subscript-operator voegt een standaardwaarde in als de sleutel ontbreekt. Het at()-lid genereert een uitzondering voor ontbrekende sleutels, waardoor dit een veiligere keuze is.

Geef een aangepaste comparator door als derde sjabloonargument, bijvoorbeeld std::map. De vergelijkingsoperator 'groter' sorteert de sleutels van hoog naar laag in plaats van de standaard oplopende volgorde.

Een `std::map` slaat sleutel-waardeparen op en zoekt waarden op aan de hand van de sleutel, terwijl een `std::set` alleen unieke sleutels zonder bijbehorende waarde opslaat. Beide houden de elementen gesorteerd, maar een `map` koppelt gegevens aan elke sleutel.

Ja. AI-codeerassistenten zetten een korte prompt of opmerking om in werkende std::map-code, inclusief declaraties, invoegoproepen en iteratielussen. Controleer altijd de gegenereerde sleuteltypen, de volgorde en de randgevallen voordat u compileert.

Ja. GitHub-copiloot Het suggereert declaraties van maps, aanroepen voor invoegen en zoeken, en iteratielussen terwijl je typt. Het gaat goed om met repetitieve standaardcode, hoewel je nog steeds de uniciteit van sleutels en de logica moet controleren voordat je gaat bouwen.

Vat dit bericht samen met: