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.

  • ๐Ÿ—บ๏ธ Associativ beholder: A C++ map gemmer elementer som nรธgle-vรฆrdi-par med unikke, automatisk sorterede nรธgler.
  • ๐Ÿงฉ Header og syntaks: Inkluder kortoverskriften, og deklarer derefter std::map navn til at gemme typede par.
  • ๐Ÿ› ๏ธ Indbyggede funktioner: begin(), size(), empty(), insert(), find(), erase() og clear() administrerer kortindholdet.
  • ๐Ÿ”„ Gentagelse: En tovejs iterator gennemgรฅr kortelementer i sorteret nรธgleorden for lรฆsning eller sletning.
  • ๐Ÿ”‘ Unikke nรธgler: To elementer kan ikke dele en nรธgle, hvilket gรธr et kort ideelt som et associativt array.
  • ๐Ÿค– AI assistance: GitHub Copilot og lignende AI-assistenter scaffolder kortlรฆgningsdeklarationer og loops fra en kort kommentar.

Kort ind C++ STL

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:

C++ Eksempel pรฅ output for kortiteration 1

Her er et skรฆrmbillede af koden:

C++ Eksempel 1 kode for kortiteration

Code Forklaring:

  1. Inkluder iostream-header-filen i vores kode for at bruge dens funktioner.
  2. Inkluder strenghovedfilen i vores kode for at bruge dens funktioner.
  3. Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner.
  4. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  5. Kald funktionen main(). { markerer begyndelsen af โ€‹โ€‹funktionens brรธdtekst.
  6. Opret et kort med navnet Studenter, hvor nรธglerne vil vรฆre heltal, og vรฆrdierne vil vรฆre strenge.
  7. Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 200 og en vรฆrdi af Alice vil blive indsat i kortet.
  8. Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 201 og en vรฆrdi af John vil blive indsat i kortet.
  9. Brug funktionen size() til at fรฅ stรธrrelsen pรฅ kortet med navnet Students. Dette burde returnere 2.
  10. Udskriv noget tekst pรฅ konsollen.
  11. Brug en for-lรธkke til at oprette en iterator ved navn den for at iterere over elementerne pรฅ kortet med navnet Studenter.
  12. Udskriv vรฆrdierne af kortet Elever pรฅ konsollen.
  13. Enden af โ€‹โ€‹kroppen af โ€‹โ€‹for-lรธkken.
  14. 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:

C++ Eksempel pรฅ kortindsรฆttelse 2 output

Her er et skรฆrmbillede af koden:

C++ Eksempel 2 kode til kortindsรฆtning

Code Forklaring:

  1. Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner.
  2. Inkluder iostream-header-filen i vores kode for at bruge dens funktioner.
  3. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  4. Kald funktionen main(). { markerer begyndelsen af โ€‹โ€‹funktionens brรธdtekst.
  5. 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.
  6. Indsรฆt en ny post pรฅ kortet m. En nรธgle pรฅ 5 og en vรฆrdi pรฅ 6 vil blive indsat i kortet.
  7. Forsรธger at indtaste en allerede eksisterende nรธgle. Da nรธglen 1 allerede findes pรฅ kortet, vil indtastningen ikke blive foretaget.
  8. 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.
  9. Udskriv noget tekst pรฅ konsollen. Tegnet "\t" skaber et vandret mellemrum, mens tegnet "\n" flytter musemarkรธren til nรฆste linje.
  10. Brug til lรธkke for at oprette en iterator ved navn itr for at iterere over elementerne pรฅ kortet ved navn m.
  11. 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.
  12. Enden af โ€‹โ€‹kroppen af โ€‹โ€‹for-lรธkken.
  13. Programmet skal returnere en vรฆrdi efter vellykket afslutning.
  14. 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:

C++ kort find sรธgning Eksempel 3 output

Her er et skรฆrmbillede af koden:

C++ kort find sรธgning Eksempel 3 kode

Code Forklaring:

  1. Inkluder iostream-header-filen i vores kode for at bruge dens funktioner uden at fรฅ fejl.
  2. Inkluder strenghovedfilen i vores kode for at bruge dens funktioner uden at fรฅ fejl.
  3. Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner uden at fรฅ fejl.
  4. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  5. Kald main()-funktionen. { markerer starten af โ€‹โ€‹โ€‹โ€‹main()-funktionens brรธdtekst.
  6. Opret et kort med navnet Studenter, hvis nรธgler vil vรฆre heltal og vรฆrdistrenge.
  7. Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 200 og en vรฆrdi af Alice vil blive indsat i kortet.
  8. Indsรฆt vรฆrdier i kortet Elever. En nรธgle pรฅ 201 og en vรฆrdi af John vil blive indsat i kortet.
  9. Se efter vรฆrdien forbundet med en nรธgle pรฅ 201.
  10. Brug en if-sรฆtning til at kontrollere, om vรฆrdien for nรธglen er fundet.
  11. Udskriv nรธglens vรฆrdi sammen med noget tekst pรฅ konsollen.
  12. Slutningen af โ€‹โ€‹brรธdteksten i if-erklรฆringen.
  13. 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:

C++ kort slet slet Eksempel 4 output

Her er et skรฆrmbillede af koden:

C++ kort sletning slet eksempel 4 kode

Code Forklaring:

  1. Inkluder iostream-header-filen i vores kode for at bruge dens funktioner.
  2. Inkluder strenghovedfilen i vores kode for at bruge dens funktioner.
  3. Inkluder kortoverskriftsfilen i vores kode for at bruge dens funktioner.
  4. Inkluder std-navneomrรฅdet i vores kode for at bruge dets klasser uden at kalde det.
  5. Kald main()-funktionen. { markerer starten af โ€‹โ€‹โ€‹โ€‹main()-funktionens brรธdtekst.
  6. Opret et kort med navnet my_map, hvis nรธgler vil vรฆre strenge og vรฆrdier heltal.
  7. Indsรฆt vรฆrdier i kortet my_map. En nรธgle med ko og en vรฆrdi pรฅ 1 vil blive indsat pรฅ kortet.
  8. Indsรฆt vรฆrdier i kortet my_map. En nรธgle af Cat og en vรฆrdi pรฅ 2 vil blive indsat i kortet.
  9. Tilfรธj en vรฆrdi 3 til kortet my_map med en nรธgle fra en lรธve.
  10. Opret en iterator til at iterere over kortet my_map pรฅ udkig efter nรธglekatten.
  11. Slet det element, som iteratoren peger pรฅ.
  12. Brug en iterator til at iterere over elementerne i kortet my_map fra start til slut.
  13. Udskriv indholdet af kortet my_map pรฅ konsollen.
  14. Programmet skal returnere output efter vellykket afslutning.
  15. Slutningen af โ€‹โ€‹hoveddelen af โ€‹โ€‹funktionen main().

Ofte Stillede Spรธrgsmรฅl

std::map holder nรธgler sorteret ved hjรฆlp af et selvbalancerende binรฆrt sรธgetrรฆ, hvilket giver O(log n) operationer. std::unordered_map bruger en hashtabel til gennemsnitlige O(1) opslag, men gemmer nรธgler i ingen bestemt rรฆkkefรธlge. Vรฆlg baseret pรฅ dine rรฆkkefรธlgebehov.

Et std::map implementeres typisk som et selvbalancerende binรฆrt sรธgetrรฆ, oftest et rรธd-sort trรฆ. Dette holder nรธgler i sorteret rรฆkkefรธlge og garanterer logaritmisk tid til indsรฆttelse, sletning og sรธgeoperationer.

Nej. En std::map indeholder kun unikke nรธgler, sรฅ indsรฆttelse af en eksisterende nรธgle overskriver den ikke. Nรฅr duplikerede nรธgler er nรธdvendige, skal du bruge std::multimap, som tillader flere elementer at dele den samme nรธglevรฆrdi.

Brug map_name[key] til at lรฆse eller tildele en vรฆrdi; subscript-operatoren indsรฆtter en standardindtastning, hvis nรธglen mangler. at()-medlemmet udlรธser en undtagelse for manglende nรธgler, hvilket gรธr det til et sikrere valg.

Send en brugerdefineret komparator som det tredje skabelonargument, f.eks. std::map >. Den stรธrre komparator sorterer nรธgler fra hรธjeste til laveste i stedet for den standardmรฆssige stigende rรฆkkefรธlge.

Et std::map gemmer nรธgle-vรฆrdi-par og slรฅr vรฆrdier op efter nรธgle, mens et std::set kun gemmer unikke nรธgler uden tilhรธrende vรฆrdi. Begge holder elementerne sorteret, men et map associerer data med hver nรธgle.

Ja. AI-kodningsassistenter omdanner en kort prompt eller kommentar til fungerende std::map-kode, inklusive deklarationer, insert-kald og iteratorlรธkker. Gennemgรฅ altid de genererede nรธgletyper, rรฆkkefรธlge og kanttilfรฆlde, fรธr du kompilerer.

Ja. GitHub Copilot foreslรฅr kortdeklarationer, indsรฆttelses- og sรธgningskald og iterationslรธkker, mens du skriver. Den hรฅndterer gentagne standardtekster godt, selvom du stadig bรธr verificere nรธgleunikhed og logik, fรธr du bygger.

Opsummer dette indlรฆg med: