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.

  • ๐Ÿ—บ๏ธ Assosiativ beholder: A C++ map lagrer elementer som nรธkkelverdipar med unike, automatisk sorterte nรธkler.
  • ๐Ÿงฉ Overskrift og syntaks: Inkluder kartoverskriften, og deklarer deretter std::map navn for รฅ lagre typepar.
  • ๐Ÿ› ๏ธ Innebygde funksjoner: begin(), size(), empty(), insert(), find(), erase() og clear() administrerer kartinnhold.
  • ๐Ÿ”„ Iterasjon: En toveis iterator gรฅr gjennom kartelementer i sortert nรธkkelrekkefรธlge for lesing eller sletting.
  • ๐Ÿ”‘ Unike nรธkler: To elementer kan ikke dele en nรธkkel, noe som gjรธr et kart ideelt som en assosiativ matrise.
  • ๐Ÿค– AI-hjelp: GitHub Copilot og lignende AI-assistenter stillaserer kartleggingsdeklarasjoner og lรธkker fra en kort kommentar.

Kart inn C++ STL

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:

C++ Eksempel pรฅ kartiterasjon 1 utdata

Her er et skjermbilde av koden:

C++ Eksempel pรฅ kode for kartiterasjon 1

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder strengoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
  4. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  5. Kalle hoved()-funksjonen. { markerer begynnelsen pรฅ kroppen til funksjonen.
  6. Lag et kart kalt Studenter der nรธklene vil vรฆre heltall, og verdiene vil vรฆre strenger.
  7. Sett inn verdier i kartet Elever. En nรธkkel pรฅ 200 og en verdi pรฅ Alice vil bli satt inn i kartet.
  8. Sett inn verdier i kartet Elever. En nรธkkel pรฅ 201 og en verdi pรฅ John vil bli satt inn i kartet.
  9. Bruk size()-funksjonen for รฅ fรฅ stรธrrelsen pรฅ kartet som heter Studenter. Dette skal returnere en 2.
  10. Skriv ut litt tekst pรฅ konsollen.
  11. Bruk en for-lรธkke for รฅ lage en iterator kalt den for รฅ iterere over elementene pรฅ kartet kalt Studenter.
  12. Skriv ut verdiene til kartet Studenter pรฅ konsollen.
  13. Enden av kroppen til for-lรธkken.
  14. 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:

C++ kartinnsetting Eksempel 2 utdata

Her er et skjermbilde av koden:

C++ Eksempel pรฅ kode for kartinnsetting 2

Code Forklaring:

  1. Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  4. Kalle hoved()-funksjonen. { markerer begynnelsen pรฅ kroppen til funksjonen.
  5. 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.
  6. 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.
  7. Prรธver รฅ legge inn en allerede eksisterende nรธkkel. Siden nรธkkel 1 allerede finnes i kartet, vil ikke oppfรธringen bli gjort.
  8. 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.
  9. Skriv ut litt tekst pรฅ konsollen. Tegnet "\t" lager et horisontalt mellomrom mens tegnet "\n" flytter musepekeren til neste linje.
  10. Bruk for slรธyfe for รฅ lage en iterator kalt itr for รฅ iterere over elementene pรฅ kartet kalt m.
  11. 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.
  12. Enden av kroppen til for-lรธkken.
  13. Programmet mรฅ returnere en verdi ved vellykket gjennomfรธring.
  14. 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:

C++ kart finn sรธk Eksempel 3 utdata

Her er et skjermbilde av koden:

C++ kart finn sรธk Eksempel 3 kode

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene uten รฅ fรฅ feil.
  2. Inkluder strengoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene uten รฅ fรฅ feil.
  3. Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene uten รฅ fรฅ feil.
  4. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  5. Kall main()-funksjonen. { markerer begynnelsen pรฅ hoveddelen av main()-funksjonen.
  6. Lag et kart kalt Studenter hvis nรธkler vil vรฆre heltall og verdistrenger.
  7. Sett inn verdier i kartet Elever. En nรธkkel pรฅ 200 og en verdi pรฅ Alice vil bli satt inn i kartet.
  8. Sett inn verdier i kartet Elever. En nรธkkel pรฅ 201 og en verdi pรฅ John vil bli satt inn i kartet.
  9. Se etter verdien knyttet til en nรธkkel pรฅ 201.
  10. Bruk en if-setning for รฅ sjekke om verdien for nรธkkelen er funnet.
  11. Skriv ut verdien av nรธkkelen sammen med litt tekst pรฅ konsollen.
  12. Slutten av brรธdteksten til if-setningen.
  13. 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:

C++ kart sletting sletting Eksempel 4 utdata

Her er et skjermbilde av koden:

C++ kart sletting sletting Eksempel 4 kode

Code Forklaring:

  1. Inkluder iostream-headerfilen i koden vรฅr for รฅ bruke funksjonene.
  2. Inkluder strengoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
  3. Inkluder kartoverskriftsfilen i koden vรฅr for รฅ bruke funksjonene.
  4. Inkluder std-navneomrรฅdet i koden vรฅr for รฅ bruke klassene uten รฅ kalle det.
  5. Kall main()-funksjonen. { markerer begynnelsen pรฅ hoveddelen av main()-funksjonen.
  6. Lag et kart kalt my_map hvis nรธkler vil vรฆre strenger og verdier heltall.
  7. Sett inn verdier i kartet my_map. En nรธkkel av Cow og en verdi pรฅ 1 vil bli satt inn i kartet.
  8. Sett inn verdier i kartet my_map. En nรธkkel av Cat og en verdi pรฅ 2 vil bli satt inn i kartet.
  9. Legg til en verdi 3 pรฅ kartet my_map med en nรธkkel til en lรธve.
  10. Lag en iterator for รฅ iterere over kartet my_map pรฅ jakt etter nรธkkelkatten.
  11. Slett elementet som iteratoren peker pรฅ.
  12. Bruk en iterator til รฅ iterere over elementene i kartet mitt_kart fra start til slutt.
  13. Skriv ut innholdet av kartet my_map pรฅ konsollen.
  14. Programmet mรฅ returnere utdata etter vellykket gjennomfรธring.
  15. Slutten av hoveddelen av hoved()-funksjonen.

Spรธrsmรฅl og svar

std::map holder nรธklene sortert ved hjelp av et selvbalanserende binรฆrt sรธketre, noe som gir O(log n) operasjoner. std::unordered_map bruker en hash-tabell for gjennomsnittlige O(1) oppslag, men lagrer nรธkler i ingen bestemt rekkefรธlge. Velg basert pรฅ dine rekkefรธlgebehov.

Et std::map implementeres vanligvis som et selvbalanserende binรฆrt sรธketre, oftest et rรธd-svart tre. Dette holder nรธklene i sortert rekkefรธlge og garanterer logaritmisk tid for innsetting, sletting og sรธkeoperasjoner.

Nei. En std::map inneholder bare unike nรธkler, sรฅ รฅ sette inn en eksisterende nรธkkel overskriver den ikke. Nรฅr duplikate nรธkler er nรธdvendige, bruk std::multimap, som lar flere elementer dele samme nรธkkelverdi.

Bruk map_name[key] til รฅ lese eller tilordne en verdi; subscript-operatoren setter inn en standardoppfรธring hvis nรธkkelen mangler. at()-medlemmet kaster et unntak for fravรฆrende nรธkler, noe som gjรธr det til et tryggere valg.

Send en tilpasset komparator som det tredje malargumentet, for eksempel std::map >. Den stรธrre komparatoren sorterer nรธkler fra hรธyeste til laveste i stedet for standard stigende rekkefรธlge.

En std::map lagrer nรธkkelverdipar og slรฅr opp verdier etter nรธkkel, mens en std::set bare lagrer unike nรธkler uten tilhรธrende verdi. Begge holder elementene sortert, men en map knytter data til hver nรธkkel.

Ja. AI-kodingsassistenter gjรธr en kort prompt eller kommentar om til fungerende std::map-kode, inkludert deklarasjoner, insert-kall og iteratorlรธkker. Gjennomgรฅ alltid de genererte nรธkkeltypene, rekkefรธlgen og kanttilfellene fรธr kompilering.

Ja. GitHub Copilot foreslรฅr kartdeklarasjoner, innsettings- og sรธk-kall og iterasjonslรธkker mens du skriver. Den hรฅndterer repeterende standardtekst godt, men du bรธr fortsatt bekrefte nรธkkelunikhet og logikk fรธr du bygger.

Oppsummer dette innlegget med: