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

Kodeforklaring:

  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

Kodeforklaring:

  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

Kodeforklaring:

  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

Kodeforklaring:

  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.