Kart inn C++ Standard malbibliotek (STL)
โก Smart oppsummering
Kart inn C++ er en assosiativ beholder fra Standard Template Library som lagrer elementer som sorterte nรธkkelverdipar, der hver unike nรธkkel tilordnes til รฉn verdi og muliggjรธr raskt oppslag, innsetting og ordnet traversering.

Hva er Map i C++?
In C++, et MAP er en assosiativ beholder som lagrer elementer i en tilordnet form. Hvert element i kartet er satt sammen av en nรธkkelverdi og en tilordnet verdi. To tilordnede verdier kan ikke dele de samme nรธkkelverdiene.
Nรธkkelverdiene er nyttige for รฅ sortere og identifisere elementer unikt, mens de tilordnede verdiene lagrer innholdet som er knyttet til hver nรธkkel. De to kan vรฆre forskjellige i type, men medlemstypen kombinerer dem til et par som inneholder begge.
Fรธr du skriver kode, er det nyttig รฅ vite hvorfor et kart ofte er den rette beholderen รฅ strekke seg etter.
Hvorfor bruke std::map?
Her er grunner til รฅ bruke et kart:
- std::map lagrer kun unike nรธkler, i sortert rekkefรธlge basert pรฅ de valgte sorteringskriteriene.
- Det er enkelt og raskt รฅ sรธke etter elementer ved hjelp av tasten.
- Bare ett element er festet til hver nรธkkel.
- std::map kan brukes som en assosiativ matrise.
- std::map kan implementeres ved hjelp av balanserte binรฆre trรฆr.
For รฅ bruke disse fordelene, start med deklarasjonssyntaksen.
syntax
For รฅ erklรฆre std::map, bruk denne syntaksen:
std::map<key_datatype, value_datatype>map_name;
- Ocuco nรธkkeldatatype angir datatypen til kartnรธklene.
- Ocuco verdi_datatype angir datatypen til verdiene som tilsvarer kartnรธklene.
- Ocuco kartnavn er navnet pรฅ kartet.
For eksempel:
map<string, int> my_map;
Vi deklarerte et kart med navnet my_map. Kartet vil ha en streng som nรธkkeldatatype og et heltall som verdidatatype.
Medlemstyper
Medlemsfunksjonene kan bruke fรธlgende medlemstyper enten som parametere eller returtype:
- nรธkkeltype: Nรธkkel (den fรธrste parameteren i malen)
- kartlagt_type: T (den andre parameteren i malen)
- key_compare: Sammenlign (den tredje parameteren i malen)
- allocator_type: Alloc (den fjerde parameteren i malen)
- verditype: par
- verdi_sammenlign: Nestet funksjonsklasse for รฅ sammenligne elementer
- referanse: allocator_type::referanse
- const_reference: allocator_type::const_reference
- pekeren: allocator_type::peker
- const_pointer: allocator_type::const_pointer
- iterator: en toveis iterator til verditype
- const_iterator: en toveis iterator til const verdi_type
- reverse_iterator: en omvendt iterator
- const_reverse_iterator: en konstant omvendt iterator
- forskjellstype: ptrdiff_t
- stรธrrelse_type: stรธrrelse_t
Innebygde funksjoner til std::map
std::map kommer med innebygde funksjoner. Noen av disse inkluderer:
- begynne () โ Denne funksjonen returnerer iteratoren til det fรธrste elementet pรฅ kartet.
- stรธrrelse() โ Denne funksjonen returnerer antall elementer i et kart.
- tรธmme() โ Denne funksjonen returnerer en boolsk verdi som angir om et kart er tomt.
- sett inn(par(nรธkkel, verdi)) โ Denne funksjonen setter inn et nytt nรธkkel-verdi-par i et kart.
- finn(verdi) โ Denne funksjonen gir iteratoren til val-elementet hvis det blir funnet. Ellers returnerer den m.end().
- slette (iteratorposisjon) โ Denne funksjonen sletter elementet pรฅ posisjonen som iteratoren peker pรฅ.
- slette(konst g) โ Denne funksjonen sletter nรธkkelverdien g fra et kart.
- klar() โ Denne funksjonen sletter alle elementer fra et kart.
Nรฅr funksjonene er definert, setter fรธlgende eksempler dem i verk, startende med iterasjon.
Iterering over kartelementer
Du kan iterere over kartelementene. Vi trenger bare รฅ lage en iterator og bruke den til dette. For eksempel:
Eksempel 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; } }
Utgang:
Her er et skjermbilde av koden:
Code Forklaring:
- Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder strengoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
- Kalle hoved()-funksjonen. { markerer begynnelsen pรฅ kroppen til funksjonen.
- Lag et kart kalt Studenter der nรธklene vil vรฆre heltall, og verdiene vil vรฆre strenger.
- Sett inn verdier i kartet Elever. En nรธkkel pรฅ 200 og en verdi pรฅ Alice vil bli satt inn i kartet.
- Sett inn verdier i kartet Elever. En nรธkkel pรฅ 201 og en verdi pรฅ John vil bli satt inn i kartet.
- Bruk size()-funksjonen for รฅ fรฅ stรธrrelsen pรฅ kartet som heter Studenter. Dette skal returnere en 2.
- Skriv ut litt tekst pรฅ konsollen.
- Bruk en for-lรธkke for รฅ lage en iterator kalt den for รฅ iterere over elementene pรฅ kartet kalt Studenter.
- Skriv ut verdiene til kartet Studenter pรฅ konsollen.
- Enden av kroppen til for-lรธkken.
- Slutten av hoveddelen av hoved()-funksjonen.
Setter inn data i std::map
Du kan legge inn elementer i std::map ved hjelp av insert()-funksjonen. Husk at std::map-nรธklene mรฅ vรฆre unike.
Sรฅ den sjekker fรธrst om hver nรธkkel er til stede i kartet. Hvis den er til stede, vil ikke oppfรธringen bli satt inn, men den returnerer iteratoren for den eksisterende oppfรธringen. Hvis den ikke er til stede, settes oppfรธringen inn.
Funksjonen har fรธlgende variasjoner:
- sett inn (par) โ med denne variasjonen settes et nรธkkel-verdi-par inn i kartet.
- sett inn(start_itr, slutt_itr) โ med denne variasjonen vil oppfรธringene bli satt inn innenfor omrรฅdet definert av start_itr og end_itr fra et annet kart.
Funksjonen insert_or_assign() fungerer pรฅ samme mรฅte som insert()-funksjonen, men hvis den gitte nรธkkelen allerede finnes i kartet, vil verdien bli endret.
Eksempel 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; }
Utgang:
Her er et skjermbilde av koden:
Code Forklaring:
- Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
- Kalle hoved()-funksjonen. { markerer begynnelsen pรฅ kroppen til funksjonen.
- Lag et kart kalt m hvor nรธklene vil vรฆre heltall, og verdiene vil vรฆre heltall. Tre oppfรธringer er gjort i kartet.
- Sett inn en ny oppfรธring i kartet m. En nรธkkel pรฅ 5 og en verdi pรฅ 6 vil bli satt inn i kartet.
- Prรธver รฅ legge inn en allerede eksisterende nรธkkel. Siden nรธkkel 1 allerede finnes i kartet, vil ikke oppfรธringen bli gjort.
- Bruker insert_or_assign()-funksjonen til รฅ sette inn eller endre en eksisterende oppfรธring. Siden nรธkkel 1 allerede finnes, vil verdien endres til 6.
- Skriv ut litt tekst pรฅ konsollen. Tegnet "\t" lager et horisontalt mellomrom mens tegnet "\n" flytter musepekeren til neste linje.
- Bruk for slรธyfe for รฅ lage en iterator kalt itr for รฅ iterere over elementene pรฅ kartet kalt m.
- Skriv ut verdiene til kartet m pรฅ konsollen. Tegnet "\t" lager et horisontalt mellomrom mellom hver tast og dens tilsvarende verdi. Derimot flytter tegnet "\n" musepekeren til neste linje etter hver iterasjon.
- Enden av kroppen til for-lรธkken.
- Programmet mรฅ returnere en verdi ved vellykket gjennomfรธring.
- Slutten av hoveddelen av hoved()-funksjonen.
Sรธker i et kart
Vi kan bruke find()-funksjonen til รฅ sรธke etter elementer i et kart etter nรธklene deres. Hvis nรธkkelen ikke finnes, returnerer funksjonen std::map::end. Ellers returneres en iterator av det sรธkte elementet.
Eksempel 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'; } }
Utgang:
Her er et skjermbilde av koden:
Code Forklaring:
- Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene uten รฅ fรฅ feil.
- Inkluder strengoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene uten รฅ fรฅ feil.
- Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene uten รฅ fรฅ feil.
- Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
- Kall main()-funksjonen. { markerer begynnelsen pรฅ hoveddelen av main()-funksjonen.
- Lag et kart kalt Studenter hvis nรธkler vil vรฆre heltall og verdistrenger.
- Sett inn verdier i kartet Elever. En nรธkkel pรฅ 200 og en verdi pรฅ Alice vil bli satt inn i kartet.
- Sett inn verdier i kartet Elever. En nรธkkel pรฅ 201 og en verdi pรฅ John vil bli satt inn i kartet.
- Se etter verdien knyttet til en nรธkkel pรฅ 201.
- Bruk en if-setning for รฅ sjekke om verdien for nรธkkelen er funnet.
- Skriv ut verdien av nรธkkelen sammen med litt tekst pรฅ konsollen.
- Slutten av brรธdteksten til if-setningen.
- Slutten av hoveddelen av hoved()-funksjonen.
Slette data fra et kart
Vi kan bruke erase()-funksjonen til รฅ slette en verdi fra et kart. Vi lager ganske enkelt en iterator som peker til elementet som skal slettes. Iteratoren sendes deretter til erase()-funksjonen.
Eksempel 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; }
Utgang:
Her er et skjermbilde av koden:
Code Forklaring:
- Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder strengoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
- Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
- Kall main()-funksjonen. { markerer begynnelsen pรฅ hoveddelen av main()-funksjonen.
- Lag et kart kalt my_map hvis nรธkler vil vรฆre strenger og verdier heltall.
- Sett inn verdier i kartet my_map. En nรธkkel av Cow og en verdi pรฅ 1 vil bli satt inn i kartet.
- Sett inn verdier i kartet my_map. En nรธkkel av Cat og en verdi pรฅ 2 vil bli satt inn i kartet.
- Legg til en verdi 3 pรฅ kartet my_map med en nรธkkel til en lรธve.
- Lag en iterator for รฅ iterere over kartet my_map pรฅ jakt etter nรธkkelkatten.
- Slett elementet som iteratoren peker pรฅ.
- Bruk en iterator til รฅ iterere over elementene i kartet mitt_kart fra start til slutt.
- Skriv ut innholdet av kartet my_map pรฅ konsollen.
- Programmet mรฅ returnere utdata etter vellykket gjennomfรธring.
- Slutten av hoveddelen av hoved()-funksjonen.






