Kort ind C++ Standard skabelonbibliotek (STL)

Hvad er Map i C++? Syntaks

In C++, en MAP er en associativ beholder, der gemmer elementer i en kortlagt form. Hvert element pรฅ kortet er sammensat af nรธglevรฆrdi og en tilknyttet vรฆrdi. To tilknyttede vรฆrdier kan ikke dele de samme nรธglevรฆrdier.

Nรธglevรฆrdierne er gode til at sortere og identificere elementer unikt. De tilknyttede vรฆrdier er til lagring af indhold forbundet med nรธglen. De to kan vรฆre forskellige i typer, men medlemstypen kombinerer dem via en partype, der kombinerer begge.

Hvorfor bruge std::map?

Her er grunde til at bruge kort:

  • std:: kort gemmer kun unikke nรธgler i sorteret rรฆkkefรธlge baseret pรฅ valgte sorteringskriterier.
  • Det er nemt og hurtigere 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 binรฆre trรฆer (balanceret).

Syntaks

For at erklรฆre std::map skal du bruge denne syntaks:

std::map<key_datatype, value_datatype>map_name; 
  • key_datatype angiver korttasternes datatype.
  • value_datatype angiver datatypen for de vรฆrdier, der svarer til korttasterne.
  • map_name er navnet pรฅ kortet.

For eksempel:

map<string, int> my_map; 

Vi erklรฆrede et kort navngivet my_map. Kortet vil have en streng som nรธgle datatyper og heltal som vรฆrdier datatype.

Medlemstyper

Medlemsfunktionerne kan bruge fรธlgende medlemstyper som enten parametre eller returtype:

  • 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.
  • tomme() โ€“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รธglevรฆrdi-par til et kort.
  • find(val) โ€“ Denne funktion giver iteratoren til val-elementet, hvis det er fundet. Ellers vil den returnere m.end().
  • Slet (iteratorposition) โ€“ Denne funktion sletter elementet pรฅ den position, som iteratoren peger pรฅ.
  • slette(konst g) โ€“ Denne funktion sletter nรธglevรฆrdi g fra et kort.
  • Ryd () โ€“Denne funktion sletter alle elementer fra et kort.

Iteration over kortelementer

Du kan iterere over kortelementerne. Vi skal simpelthen 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:

Iteration over kortelementer

Her er et skรฆrmbillede af koden:

Iteration over kortelementer

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. Ring til main() fungere. { 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 size() funktion for at fรฅ stรธrrelsen pรฅ kortet med navnet Studenter. Dette skulle returnere en 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 โ€‹โ€‹kroppen af main() funktion.

Indsรฆttelse af data i std::map

Du kan indtaste elementer i std::map ved hjรฆlp af insert() fungere. Husk at std::map nรธglerne skal vรฆre unikke.

Sรฅ det tjekker fรธrst, om hver nรธgle er til stede pรฅ 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รธglevรฆrdi-par i kortet.
  • indsรฆt(start_itr, end_itr) โ€“ med denne variation vil posterne blive indsat inden for omrรฅdet defineret af start_itr og end_itr fra et andet kort.

insert_or_assing() funktion fungerer pรฅ samme mรฅde som insert() funktion, 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:

Indsรฆttelse af data i std::map

Her er et skรฆrmbillede af koden:

Indsรฆttelse af data i std::map

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. Ring til main() fungere. { 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 insert_or_assign() funktion til at indsรฆtte eller รฆndre en eksisterende post. Da nรธglen 1 allerede eksisterer, รฆ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 en lรธkke.
  13. Programmet skal returnere vรฆrdi efter vellykket afslutning.
  14. Slutningen af โ€‹โ€‹kroppen af main() funktion.

Sรธgning i et kort

Vi kan bruge find() funktion til at sรธge efter elementer pรฅ et kort med deres taster. Hvis nรธglen ikke findes, returnerer funktionen std::map::end. Ellers vil en iterator af det sรธgte element blive returneret.

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:

Sรธgning i et kort

Her er et skรฆrmbillede af koden:

Sรธgning i et kort

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. Ring til main() fungere. { markerer begyndelsen af โ€‹โ€‹kroppen af main() funktion.
  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 af โ€‹โ€‹if-erklรฆring.
  13. Slutningen af โ€‹โ€‹kroppen af main() funktion.

Sletning af data fra et kort

Vi kan bruge erase() funktion til at slette en vรฆrdi fra et kort. Vi opretter simpelthen en iterator, der peger pรฅ det element, der skal slettes. Iteratoren sendes derefter til erase() funktion.

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:

Sletning af data fra et kort

Her er et skรฆrmbillede af koden:

Sletning af data fra et kort

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. Ring til main() fungere. { markerer begyndelsen af โ€‹โ€‹kroppen af main() funktion.
  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 โ€‹โ€‹kroppen af main() funktion.

Resumรฉ

  • Et kort er en associativ beholder, der gemmer elementer i en kortlagt form.
  • Hvert element pรฅ kortet har en nรธglevรฆrdi og en kortlagt vรฆrdi.
  • I et kort kan to tilknyttede vรฆrdier ikke dele nรธglevรฆrdier.
  • Nรธglevรฆrdierne hjรฆlper med at sortere og identificere elementer unikt.
  • De tilknyttede vรฆrdier hjรฆlper med at gemme indhold forbundet med nรธglen.
  • C++ map gemmer unikke nรธgler i sorteret rรฆkkefรธlge.
  • At arbejde med C++ map, opretter vi en iterator til at iterere over elementerne.
  • Med iteratoren kan vi udfรธre opgaver som at sรธge og slette elementer fra kortet.

Opsummer dette indlรฆg med: