Kort ind C++ Standard skabelonbibliotek (STL)
โก Smart opsummering
Kort ind C++ er en associativ container fra Standard Template Library, der lagrer elementer som sorterede nรธgle-vรฆrdi-par, hvor hver unikke nรธgle knyttes til รฉn vรฆrdi og muliggรธr hurtig opslag, indsรฆttelse og ordnet gennemgang.

Hvad er Map i C++?
In C++, et MAP er en associativ container, der lagrer elementer i en kortlagt form. Hvert element i kortet er sammensat af en nรธglevรฆrdi og en kortlagt vรฆrdi. To kortlagte vรฆrdier kan ikke dele de samme nรธglevรฆrdier.
Nรธglevรฆrdierne er nyttige til at sortere og identificere elementer unikt, mens de kortlagte vรฆrdier gemmer det indhold, der er knyttet til hver nรธgle. De to kan variere i type, men medlemstypen kombinerer dem til et par, der indeholder begge.
Fรธr du skriver kode, er det nyttigt at vide, hvorfor et kort ofte er den rette beholder at rรฆkke ud efter.
Hvorfor bruge std::map?
Her er grunde til at bruge et kort:
- std::map gemmer kun unikke nรธgler i sorteret rรฆkkefรธlge baseret pรฅ de valgte sorteringskriterier.
- Det er nemt og hurtigt at sรธge efter elementer ved hjรฆlp af tasten.
- Der er kun knyttet et element til hver nรธgle.
- std::map kan bruges som et associativt array.
- std::map kan implementeres ved hjรฆlp af balancerede binรฆre trรฆer.
For at udnytte disse fordele skal du starte med deklarationssyntaksen.
Syntaks
For at erklรฆre std::map skal du bruge denne syntaks:
std::map<key_datatype, value_datatype>map_name;
- nรธgledatatype angiver korttasternes datatype.
- vรฆrdi_datatype angiver datatypen for de vรฆrdier, der svarer til korttasterne.
- kortnavn er navnet pรฅ kortet.
For eksempel:
map<string, int> my_map;
Vi har deklareret et kort med navnet my_map. Kortet vil have en streng som nรธgledatatype og et heltal som vรฆrdidatatype.
Medlemstyper
Medlemsfunktionerne kan bruge fรธlgende medlemstyper som enten parametre eller returtyper:
- key_type: Nรธgle (den fรธrste parameter i skabelonen)
- kortlagt_type: T (den anden parameter i skabelonen)
- key_compare: Sammenlign (den tredje parameter i skabelonen)
- allocator_type: Alloc (den fjerde parameter i skabelonen)
- vรฆrditype: par
- vรฆrdi_sammenlign: Indlejret funktionsklasse til sammenligning af elementer
- reference: allocator_type::reference
- const_reference: allocator_type::const_reference
- pointer: allocator_type::pointer
- const_pointer: allocator_type::const_pointer
- iterator: en tovejs iterator til vรฆrditypen
- const_iterator: en tovejs iterator til const value_type
- omvendt_iterator: en omvendt iterator
- const_reverse_iterator: en konstant omvendt iterator
- forskelstype: ptrdiff_t
- stรธrrelses Type: stรธrrelse_t
Indbyggede funktioner i std::map
std::map leveres med indbyggede funktioner. Nogle af disse omfatter:
- begynde () โ Denne funktion returnerer iteratoren til det fรธrste element pรฅ kortet.
- stรธrrelse() โ Denne funktion returnerer antallet af elementer i et kort.
- tom() โ Denne funktion returnerer en boolsk vรฆrdi, der angiver, om et kort er tomt.
- indsรฆt(par(nรธgle, vรฆrdi)) โ Denne funktion indsรฆtter et nyt nรธgle-vรฆrdi-par i et kort.
- find(vรฆrdi) โ Denne funktion giver iteratoren til val-elementet, hvis det findes. Ellers returnerer den m.end().
- slet (iteratorposition) โ Denne funktion sletter elementet pรฅ den position, som iteratoren peger pรฅ.
- slette(konst g) โ Denne funktion sletter nรธglevรฆrdien g fra et kort.
- klar() โ Denne funktion sletter alle elementer fra et kort.
Nรฅr funktionerne er defineret, sรฆttes de fรธlgende eksempler i gang, startende med iteration.
Iteration over kortelementer
Du kan iterere over kortelementerne. Vi skal blot oprette en iterator og bruge 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; } }
Output:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Inkluder iostream-header-filen i vores kode for at bruge dens funktioner.
- Inkluder strenghovedfilen i vores kode for at bruge dens funktioner.
- Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner.
- Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
- Kald funktionen main(). { markerer begyndelsen af โโfunktionens brรธdtekst.
- Opret et kort med navnet Studenter, hvor nรธglerne vil vรฆre heltal, og vรฆrdierne vil vรฆre strenge.
- Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 200 og en vรฆrdi af Alice vil blive indsat i kortet.
- Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 201 og en vรฆrdi af John vil blive indsat i kortet.
- Brug funktionen size() til at fรฅ stรธrrelsen pรฅ kortet med navnet Students. Dette burde returnere 2.
- Udskriv noget tekst pรฅ konsollen.
- Brug en for-lรธkke til at oprette en iterator ved navn den for at iterere over elementerne pรฅ kortet med navnet Studenter.
- Udskriv vรฆrdierne af kortet Elever pรฅ konsollen.
- Enden af โโkroppen af โโfor-lรธkken.
- Slutningen af โโhoveddelen af โโfunktionen main().
Indsรฆttelse af data i std::map
Du kan indtaste elementer i std::map ved hjรฆlp af funktionen insert(). Husk at std::map-nรธglerne skal vรฆre unikke.
Sรฅ den kontrollerer fรธrst, om hver nรธgle er til stede i kortet. Hvis den er til stede, vil posten ikke blive indsat, men den returnerer iteratoren for den eksisterende post. Hvis den ikke er til stede, indsรฆttes posten.
Funktionen har fรธlgende variationer:
- indsรฆt (par) โ med denne variation indsรฆttes et nรธgle-vรฆrdi-par i kortet.
- indsรฆt(start_itr, slut_itr) โ med denne variation vil posterne blive indsat inden for det omrรฅde, der er defineret af start_itr og end_itr fra et andet kort.
Funktionen insert_or_assign() fungerer pรฅ samme mรฅde som insert()-funktionen, men hvis den givne nรธgle allerede findes i kortet, vil dens vรฆrdi blive รฆndret.
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; }
Output:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner.
- Inkluder iostream-header-filen i vores kode for at bruge dens funktioner.
- Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
- Kald funktionen main(). { markerer begyndelsen af โโfunktionens brรธdtekst.
- Opret et kort med navnet m, hvor nรธglerne vil vรฆre heltal, og vรฆrdierne vil vรฆre heltal. Der er lavet tre indtastninger pรฅ kortet.
- Indsรฆt en ny post pรฅ kortet m. En nรธgle pรฅ 5 og en vรฆrdi pรฅ 6 vil blive indsat i kortet.
- Forsรธger at indtaste en allerede eksisterende nรธgle. Da nรธglen 1 allerede findes pรฅ kortet, vil indtastningen ikke blive foretaget.
- Brug af funktionen insert_or_assign() til at indsรฆtte eller รฆndre en eksisterende post. Da nรธgle 1 allerede findes, รฆndres dens vรฆrdi til 6.
- Udskriv noget tekst pรฅ konsollen. Tegnet "\t" skaber et vandret mellemrum, mens tegnet "\n" flytter musemarkรธren til nรฆste linje.
- Brug til lรธkke for at oprette en iterator ved navn itr for at iterere over elementerne pรฅ kortet ved navn m.
- Udskriv vรฆrdierne af kortet m pรฅ konsollen. Tegnet "\t" skaber et vandret mellemrum mellem hver tast og dens tilsvarende vรฆrdi. I modsรฆtning hertil flytter tegnet "\n" musemarkรธren til nรฆste linje efter hver iteration.
- Enden af โโkroppen af โโfor-lรธkken.
- Programmet skal returnere en vรฆrdi efter vellykket afslutning.
- Slutningen af โโhoveddelen af โโfunktionen main().
Sรธgning i et kort
Vi kan bruge find()-funktionen til at sรธge efter elementer i et map via deres nรธgler. Hvis nรธglen ikke findes, returnerer funktionen std::map::end. Ellers returneres en iterator af det sรธgte element.
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'; } }
Output:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Inkluder iostream-header-filen i vores kode for at bruge dens funktioner uden at fรฅ fejl.
- Inkluder strenghovedfilen i vores kode for at bruge dens funktioner uden at fรฅ fejl.
- Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner uden at fรฅ fejl.
- Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
- Kald main()-funktionen. { markerer starten af โโโโmain()-funktionens brรธdtekst.
- Opret et kort med navnet Studenter, hvis nรธgler vil vรฆre heltal og vรฆrdistrenge.
- Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 200 og en vรฆrdi af Alice vil blive indsat i kortet.
- Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 201 og en vรฆrdi af John vil blive indsat i kortet.
- Se efter vรฆrdien forbundet med en nรธgle pรฅ 201.
- Brug en if-sรฆtning til at kontrollere, om vรฆrdien for nรธglen er fundet.
- Udskriv nรธglens vรฆrdi sammen med noget tekst pรฅ konsollen.
- Slutningen af โโbrรธdteksten i if-erklรฆringen.
- Slutningen af โโhoveddelen af โโfunktionen main().
Sletning af data fra et kort
Vi kan bruge funktionen erase() til at slette en vรฆrdi fra et kort. Vi opretter blot en iterator, der peger pรฅ det element, der skal slettes. Iteratoren sendes derefter til funktionen erase().
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; }
Output:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Inkluder iostream-header-filen i vores kode for at bruge dens funktioner.
- Inkluder strenghovedfilen i vores kode for at bruge dens funktioner.
- Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner.
- Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
- Kald main()-funktionen. { markerer starten af โโโโmain()-funktionens brรธdtekst.
- Opret et kort med navnet my_map, hvis nรธgler vil vรฆre strenge og vรฆrdier heltal.
- Indsรฆt vรฆrdier i kortet my_map. En nรธgle med ko og en vรฆrdi pรฅ 1 vil blive indsat pรฅ kortet.
- Indsรฆt vรฆrdier i kortet my_map. En nรธgle af Cat og en vรฆrdi pรฅ 2 vil blive indsat i kortet.
- Tilfรธj en vรฆrdi 3 til kortet my_map med en nรธgle fra en lรธve.
- Opret en iterator til at iterere over kortet my_map pรฅ udkig efter nรธglekatten.
- Slet det element, som iteratoren peger pรฅ.
- Brug en iterator til at iterere over elementerne i kortet my_map fra start til slut.
- Udskriv indholdet af kortet my_map pรฅ konsollen.
- Programmet skal returnere output efter vellykket afslutning.
- Slutningen af โโhoveddelen af โโfunktionen main().






