Karta in C++ Standard Template Library (STL)
โก Smart sammanfattning
Karta in C++ รคr en associativ behรฅllare frรฅn standardmallbiblioteket som lagrar element som sorterade nyckel-vรคrdepar, dรคr varje unik nyckel mappas till ett vรคrde och mรถjliggรถr snabb sรถkning, infogning och ordnad genomgรฅng.

Vad รคr Map in C++?
In C++, en MAP รคr en associativ behรฅllare som lagrar objekt i mappad form. Varje objekt i kartan bestรฅr av ett nyckelvรคrde och ett mappat vรคrde. Tvรฅ mappade vรคrden kan inte dela samma nyckelvรคrden.
Nyckelvรคrdena รคr anvรคndbara fรถr att sortera och identifiera element unikt, medan de mappade vรคrdena lagrar innehรฅllet som รคr associerat med varje nyckel. De tvรฅ kan skilja sig รฅt i typ, men medlemstypen kombinerar dem till ett par som innehรฅller bรฅda.
Innan du skriver nรฅgon kod รคr det bra att veta varfรถr en karta ofta รคr rรคtt behรฅllare att strรคcka sig efter.
Varfรถr anvรคnda std::map?
Hรคr รคr anledningar till att anvรคnda en karta:
- std::map lagrar endast unika nycklar, i sorterad ordning baserat pรฅ de valda sorteringskriterierna.
- Det รคr enkelt och snabbt att sรถka efter element med hjรคlp av tangenten.
- Endast ett element รคr fรคst vid varje nyckel.
- std::map kan anvรคndas som en associativ array.
- std::map kan implementeras med hjรคlp av balanserade binรคra trรคd.
Fรถr att utnyttja dessa fรถrdelar, bรถrja med deklarationssyntaxen.
syntax
Fรถr att deklarera std::map, anvรคnd denna syntax:
std::map<key_datatype, value_datatype>map_name;
- Ocuco-landskapet nyckeldatatyp anger kartnycklarnas datatyp.
- Ocuco-landskapet vรคrdedatatyp anger datatypen fรถr de vรคrden som motsvarar kartnycklarna.
- Ocuco-landskapet kartnamn รคr namnet pรฅ kartan.
Till exempel:
map<string, int> my_map;
Vi deklarerade en karta med namnet my_map. Kartan kommer att ha en strรคng som nyckeldatatyp och ett heltal som vรคrdedatatyp.
Medlemstyper
Medlemsfunktionerna kan anvรคnda fรถljande medlemstyper antingen som parametrar eller returtyp:
- Nyckeltyp: Nyckel (den fรถrsta parametern i mallen)
- mappad_type: T (den andra parametern i mallen)
- key_compare: Jรคmfรถr (den tredje parametern i mallen)
- allocator_type: Alloc (den fjรคrde parametern i mallen)
- vรคrde typ: par
- vรคrde_jรคmfรถr: Kapslad funktionsklass fรถr att jรคmfรถra element
- referens: allocator_type::referens
- const_reference: allocator_type::const_reference
- pekare: allocator_type::pointer
- const_pointer: allocator_type::const_pointer
- iterator: en dubbelriktad iterator till value_type
- konst_iterator: en dubbelriktad iterator till const value_type
- reverse_iterator: en omvรคnd iterator
- const_reverse_iterator: en konstant omvรคnd iterator
- skillnadstyp: ptrdiff_t
- Storleks typ: storlek_t
Inbyggda funktioner fรถr std::map
std::map kommer med inbyggda funktioner. Nรฅgra av dessa inkluderar:
- Bรถrja () โ Den hรคr funktionen returnerar iteratorn till det fรถrsta elementet pรฅ kartan.
- storlek() โ Den hรคr funktionen returnerar antalet objekt i en karta.
- tรถmma() โ Den hรคr funktionen returnerar ett booleskt vรคrde som anger om en karta รคr tom.
- insert(pair(nyckel, vรคrde)) โ Den hรคr funktionen infogar ett nytt nyckel-vรคrde-par i en karta.
- hitta(vรคrde) โ Denna funktion ger iteratorn till val-elementet om det hittas. Annars returnerar den m.end().
- radera (iteratorposition) โ Den hรคr funktionen tar bort objektet vid den position som iteratorn pekar pรฅ.
- radera(konst g) โ Den hรคr funktionen tar bort nyckel-vรคrdet g frรฅn en karta.
- klar() โ Den hรคr funktionen tar bort alla objekt frรฅn en karta.
Med funktionerna definierade omsรคtter fรถljande exempel dem i praktiken, med bรถrjan med iteration.
Itererar รถver kartelement
Du kan iterera รถver kartelementen. Vi behรถver bara skapa en iterator och anvรคnda den fรถr detta. Till exempel:
Exempelvis 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; } }
Produktion:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera strรคnghuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera karthuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Anropa main()-funktionen. { markerar bรถrjan av funktionens brรถdtext.
- Skapa en karta med namnet Studenter dรคr nycklarna kommer att vara heltal och vรคrdena kommer att vara strรคngar.
- Infoga vรคrden i kartan Studenter. En nyckel pรฅ 200 och ett vรคrde pรฅ Alice kommer att infogas i kartan.
- Infoga vรคrden i kartan Studenter. En nyckel pรฅ 201 och ett vรคrde pรฅ John kommer att infogas i kartan.
- Anvรคnd funktionen size() fรถr att hรคmta storleken pรฅ kartan med namnet Studenter. Detta ska returnera 2.
- Skriv ut lite text pรฅ konsolen.
- Anvรคnd en for-loop fรถr att skapa en iterator som heter den fรถr att iterera รถver elementen pรฅ kartan som heter Studenter.
- Skriv ut vรคrdena pรฅ kartan Studenter pรฅ konsolen.
- Slutet pรฅ kroppen av for-slingan.
- Slutet pรฅ huvuddelen av funktionen main().
Infogar data i std::map
Du kan mata in objekt i std::map med hjรคlp av funktionen insert(). Kom ihรฅg att std::map-nycklarna mรฅste vara unika.
Sรฅ den kontrollerar fรถrst om varje nyckel finns i mappningen. Om den finns kommer posten inte att infogas, men den returnerar iteratorn fรถr den befintliga posten. Om den inte finns infogas posten.
Funktionen har fรถljande varianter:
- infoga (par) โ med denna variant infogas ett nyckel-vรคrde-par i kartan.
- infoga(start_itr, slut_itr) โ med denna variant kommer posterna att infogas inom det intervall som definieras av start_itr och end_itr frรฅn en annan karta.
Funktionen insert_or_assign() fungerar pรฅ samma sรคtt som funktionen insert(), men om den givna nyckeln redan finns i mappningen kommer dess vรคrde att รคndras.
Exempelvis 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; }
Produktion:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera karthuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Anropa main()-funktionen. { markerar bรถrjan av funktionens brรถdtext.
- Skapa en karta som heter m dรคr nycklarna kommer att vara heltal och vรคrdena kommer att vara heltal. Tre poster har gjorts i kartan.
- Infoga en ny post i kartan m. En nyckel pรฅ 5 och ett vรคrde pรฅ 6 kommer att infogas i kartan.
- Fรถrsรถker skriva in en redan befintlig nyckel. Eftersom nyckeln 1 redan finns i kartan kommer inmatningen inte att gรถras.
- Anvรคnder funktionen insert_or_assign() fรถr att infoga eller รคndra en befintlig post. Eftersom nyckel 1 redan finns kommer dess vรคrde att รคndras till 6.
- Skriv ut lite text pรฅ konsolen. Tecknet "\t" skapar ett horisontellt mellanslag medan tecknet "\n" flyttar muspekaren till nรคsta rad.
- Anvรคnd fรถr slinga fรถr att skapa en iterator som heter itr fรถr att iterera รถver elementen pรฅ kartan som heter m.
- Skriv ut vรคrdena fรถr kartan m pรฅ konsolen. Tecknet "\t" skapar ett horisontellt mellanslag mellan varje tangent och dess motsvarande vรคrde. Dรคremot flyttar tecknet "\n" muspekaren till nรคsta rad efter varje iteration.
- Slutet pรฅ kroppen av for-slingan.
- Programmet mรฅste returnera ett vรคrde efter framgรฅngsrikt slutfรถrande.
- Slutet pรฅ huvuddelen av funktionen main().
Sรถker i en karta
Vi kan anvรคnda funktionen find() fรถr att sรถka efter element i en karta med hjรคlp av deras nycklar. Om nyckeln inte hittas returnerar funktionen std::map::end. Annars returneras en iterator fรถr det sรถkta elementet.
Exempelvis 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'; } }
Produktion:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner utan att fรฅ fel.
- Inkludera strรคnghuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner utan att fรฅ fel.
- Inkludera karthuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner utan att fรฅ fel.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Anropa main()-funktionen. { markerar bรถrjan pรฅ main()-funktionens brรถdtext.
- Skapa en karta med namnet Studenter vars nycklar kommer att vara heltal och vรคrdestrรคngar.
- Infoga vรคrden i kartan Studenter. En nyckel pรฅ 200 och ett vรคrde pรฅ Alice kommer att infogas i kartan.
- Infoga vรคrden i kartan Studenter. En nyckel pรฅ 201 och ett vรคrde pรฅ John kommer att infogas i kartan.
- Leta efter vรคrdet som รคr kopplat till en nyckel pรฅ 201.
- Anvรคnd en if-sats fรถr att kontrollera om vรคrdet fรถr nyckeln hittas.
- Skriv ut vรคrdet pรฅ nyckeln bredvid lite text pรฅ konsolen.
- Slutet pรฅ brรถdtexten i if-satsen.
- Slutet pรฅ huvuddelen av funktionen main().
Ta bort data frรฅn en karta
Vi kan anvรคnda funktionen erase() fรถr att ta bort ett vรคrde frรฅn en karta. Vi skapar helt enkelt en iterator som pekar pรฅ det element som ska tas bort. Iteratorn skickas sedan till funktionen erase().
Exempelvis 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; }
Produktion:
Hรคr รคr en skรคrmdump av koden:
Code Fรถrklaring:
- Inkludera iostream-huvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera strรคnghuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera karthuvudfilen i vรฅr kod fรถr att anvรคnda dess funktioner.
- Inkludera std-namnomrรฅdet i vรฅr kod fรถr att anvรคnda dess klasser utan att anropa det.
- Anropa main()-funktionen. { markerar bรถrjan pรฅ main()-funktionens brรถdtext.
- Skapa en karta som heter my_map vars nycklar kommer att vara strรคngar och vรคrden heltal.
- Infoga vรคrden i kartan my_map. En nyckel av ko och ett vรคrde pรฅ 1 kommer att infogas i kartan.
- Infoga vรคrden i kartan my_map. En nyckel av Cat och ett vรคrde pรฅ 2 kommer att infogas i kartan.
- Lรคgg till ett vรคrde 3 i kartan my_map med en nyckel frรฅn ett lejon.
- Skapa en iterator fรถr att iterera รถver kartan my_map och leta efter nyckelkatten.
- Ta bort elementet som iteratorn pekar pรฅ.
- Anvรคnd en iterator fรถr att iterera รถver elementen i kartan my_map frรฅn bรถrjan till slut.
- Skriv ut innehรฅllet pรฅ kartan my_map pรฅ konsolen.
- Programmet mรฅste returnera utdata efter framgรฅngsrikt slutfรถrande.
- Slutet pรฅ huvuddelen av funktionen main().






