Harta in C++ Bibliotecă de șabloane standard (STL)
⚡ Rezumat inteligent
Harta in C++ este un container asociativ din Biblioteca de șabloane standard care stochează elementele ca perechi cheie-valoare sortate, unde fiecare cheie unică se mapează la o valoare și permite căutarea rapidă, inserarea și traversarea ordonată.

În ce este Harta C++?
In C++, un MAP este un container asociativ care stochează elemente într-o formă mapată. Fiecare element din hartă este compus dintr-o valoare cheie și o valoare mapată. Două valori mapate nu pot avea aceleași valori cheie.
Valorile cheie sunt utile pentru sortarea și identificarea unică a elementelor, în timp ce valorile mapate stochează conținutul asociat fiecărei chei. Cele două pot diferi ca tip, dar tipul de membru le combină într-o pereche care le conține pe amândouă.
Înainte de a scrie orice cod, este util să înțelegem de ce o hartă este adesea recipientul potrivit la care să apelăm.
De ce să folosiți std::map?
Iată motivele pentru care se utilizează o hartă:
- std::map stochează doar chei unice, sortate în funcție de criteriile de sortare alese.
- Căutarea elementelor folosind cheia este ușoară și rapidă.
- La fiecare cheie este atașat un singur element.
- std::map poate fi folosit ca o matrice asociativă.
- std::map este implementabil folosind arbori binari echilibrați.
Pentru a valorifica aceste beneficii, începeți cu sintaxa de declarare.
Sintaxă
Pentru a declara std::map, utilizați această sintaxă:
std::map<key_datatype, value_datatype>map_name;
- tip_cheie_de_date indică tipul de date al cheilor hărții.
- tip_de_date_valoare denotă tipul de date al valorilor corespunzătoare cheilor de hartă.
- nume_hartă este numele hărții.
De exemplu:
map<string, int> my_map;
Am declarat o hartă numită my_map. Harta va avea un șir de caractere ca tip de date cheie și un număr întreg ca tip de date valori.
Tipuri de membri
Funcțiile membre pot utiliza următoarele tipuri de membri fie ca parametri, fie ca tip returnat:
- tip_cheie: Cheie (primul parametru din șablon)
- tip_map: T (al doilea parametru din șablon)
- key_compare: Comparare (al treilea parametru din șablon)
- allocator_type: Alloc (al patrulea parametru din șablon)
- tipul valorii: pereche
- value_compare: Clasă de funcții imbricate pentru compararea elementelor
- referinţă: allocator_type::reference
- const_reference: allocator_type::const_reference
- indicatorul: allocator_type::pointer
- const_pointer: allocator_type::const_pointer
- iterator: un iterator bidirecțional la value_type
- const_iterator: un iterator bidirecțional la const value_type
- reverse_iterator: un iterator invers
- const_reverse_iterator: un iterator invers constant
- tip_diferență: ptrdiff_t
- tipul marimii: mărime_t
Funcții încorporate ale std::map
std::map vine cu funcții încorporate. Unele dintre acestea includ:
- începe () – Această funcție returnează iteratorul la primul element al hărții.
- mărimea() – Această funcție returnează numărul de elemente dintr-o hartă.
- gol() – Această funcție returnează o valoare booleană care indică dacă o hartă este goală.
- inserează(pereche(cheie, valoare)) – Această funcție inserează o nouă pereche cheie-valoare într-o hartă.
- găsire(val) – Această funcție dă iteratorul elementului val dacă acesta este găsit. În caz contrar, returnează m.end().
- ștergere (poziția iteratorului) – Această funcție șterge elementul din poziția indicată de iterator.
- șterge (const g) – Această funcție șterge cheia-valoare g dintr-o hartă.
- clar() – Această funcție șterge toate elementele de pe o hartă.
Odată ce funcțiile sunt definite, exemplele următoare le pun în acțiune, începând cu iterația.
Iterarea peste elementele hărții
Puteți itera peste elementele hărții. Trebuie doar să creăm un iterator și să îl folosim pentru asta. De exemplu:
Exemplu 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; } }
ieșire:
Iată o captură de ecran a codului:
Code Explicaţie:
- Includeți fișierul antet iostream în codul nostru pentru a utiliza funcțiile acestuia.
- Includeți fișierul antet șir în codul nostru pentru a-i folosi funcțiile.
- Includeți fișierul antet hărții în codul nostru pentru a-i folosi funcțiile.
- Includeți spațiul de nume std în codul nostru pentru a-i folosi clasele fără a-l apela.
- Apelați funcția main(). { marchează începutul corpului funcției.
- Creați o hartă numită Students, unde cheile vor fi numere întregi, iar valorile vor fi șiruri.
- Introduceți valori în hartă Studenți. O cheie de 200 și o valoare de Alice vor fi inserate în hartă.
- Introduceți valori în hartă Studenți. O cheie de 201 și o valoare de John vor fi inserate în hartă.
- Utilizați funcția size() pentru a obține dimensiunea hărții numită Students. Acest lucru ar trebui să returneze un 2.
- Tipăriți ceva text pe consolă.
- Utilizați o buclă for pentru a crea un iterator numit acesta pentru a repeta peste elementele hărții numite Studenți.
- Tipăriți valorile hărții Studenți pe consolă.
- Capătul corpului buclei for.
- Sfârșitul corpului funcției main().
Inserarea datelor în std::map
Puteți introduce elemente în std::map folosind funcția insert(). Amintiți-vă că cheile std::map trebuie să fie unice.
Deci, mai întâi verifică dacă fiecare cheie este prezentă în hartă. Dacă este prezentă, intrarea nu va fi inserată, dar returnează iteratorul pentru intrarea existentă. Dacă nu este prezentă, intrarea este inserată.
Funcția are următoarele variații:
- inserare (pereche) – cu această variantă, o pereche cheie-valoare este inserată în hartă.
- inserează(itr_început, itr_sfârșit) – cu această variație, intrările vor fi inserate în intervalul definit de start_itr și end_itr dintr-o altă hartă.
Funcția insert_or_assign() funcționează în același mod ca și funcția insert(), dar dacă cheia dată există deja în hartă, valoarea acesteia va fi modificată.
Exemplu 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; }
ieșire:
Iată o captură de ecran a codului:
Code Explicaţie:
- Includeți fișierul antet hărții în codul nostru pentru a-i folosi funcțiile.
- Includeți fișierul antet iostream în codul nostru pentru a utiliza funcțiile acestuia.
- Includeți spațiul de nume std în codul nostru pentru a-i folosi clasele fără a-l apela.
- Apelați funcția main(). { marchează începutul corpului funcției.
- Creați o hartă numită m unde cheile vor fi numere întregi, iar valorile vor fi numere întregi. Au fost făcute trei intrări pe hartă.
- Inserați o nouă intrare în hartă m. În hartă vor fi introduse o cheie de 5 și o valoare de 6.
- Încercarea de a introduce o cheie deja existentă. Deoarece cheia 1 există deja pe hartă, introducerea nu va fi făcută.
- Utilizarea funcției insert_or_assign() pentru a insera sau modifica o intrare existentă. Deoarece cheia 1 există deja, valoarea sa va fi schimbată la 6.
- Tipăriți ceva text pe consolă. Caracterul „\t” creează un spațiu orizontal, în timp ce caracterul „\n” mută cursorul mouse-ului pe linia următoare.
- Folosi pentru bucla pentru a crea un iterator numit itr pentru a itera peste elementele hărții numite m.
- Tipăriți valorile hărții m pe consolă. Caracterul „\t” creează un spațiu orizontal între fiecare tastă și valoarea ei corespunzătoare. În schimb, caracterul „\n” mută cursorul mouse-ului pe linia următoare după fiecare iterație.
- Capătul corpului buclei for.
- Programul trebuie să returneze o valoare la finalizarea cu succes.
- Sfârșitul corpului funcției main().
Căutarea pe o hartă
Putem folosi funcția find() pentru a căuta elemente într-o hartă după cheile lor. Dacă cheia nu este găsită, funcția returnează std::map::end. În caz contrar, va fi returnat un iterator al elementului căutat.
Exemplu 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'; } }
ieșire:
Iată o captură de ecran a codului:
Code Explicaţie:
- Includeți fișierul antet iostream în codul nostru pentru a-i folosi funcțiile fără a primi erori.
- Includeți fișierul antet șir în codul nostru pentru a-i folosi funcțiile fără a primi erori.
- Includeți fișierul antet hărții în codul nostru pentru a-i folosi funcțiile fără a primi erori.
- Includeți spațiul de nume std în codul nostru pentru a-i folosi clasele fără a-l apela.
- Apelați funcția main(). { marchează începutul corpului funcției main().
- Creați o hartă numită Students ale cărei chei vor fi numere întregi și șiruri de valori.
- Introduceți valori în hartă Studenți. O cheie de 200 și o valoare de Alice vor fi inserate în hartă.
- Introduceți valori în hartă Studenți. O cheie de 201 și o valoare de John vor fi inserate în hartă.
- Căutați valoarea asociată cu o cheie de 201.
- Utilizați o instrucțiune if pentru a verifica dacă valoarea cheii este găsită.
- Tipăriți valoarea cheii alături de un text pe consolă.
- Sfârșitul corpului declarației if.
- Sfârșitul corpului funcției main().
Ștergerea datelor de pe o hartă
Putem folosi funcția erase() pentru a șterge o valoare de pe o hartă. Pur și simplu creăm un iterator care indică elementul de șters. Iteratorul este apoi trecut la funcția erase().
Exemplu 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; }
ieșire:
Iată o captură de ecran a codului:
Code Explicaţie:
- Includeți fișierul antet iostream în codul nostru pentru a utiliza funcțiile acestuia.
- Includeți fișierul antet șir în codul nostru pentru a-i folosi funcțiile.
- Includeți fișierul antet hărții în codul nostru pentru a-i folosi funcțiile.
- Includeți spațiul de nume std în codul nostru pentru a-i folosi clasele fără a-l apela.
- Apelați funcția main(). { marchează începutul corpului funcției main().
- Creați o hartă numită my_map ale cărei chei vor fi șiruri și valori întregi.
- Inserați valori în harta my_map. O cheie a lui Cow și o valoare de 1 vor fi inserate în hartă.
- Inserați valori în harta my_map. O cheie Cat și o valoare de 2 vor fi inserate în hartă.
- Adăugați o valoare 3 în harta my_map cu o cheie a unui leu.
- Creați un iterator pentru a itera pe hartă my_map căutând pisica cheie.
- Ștergeți elementul indicat de iterator.
- Folosește un iterator pentru a itera peste elementele hărții my_map de la început până la sfârșit.
- Imprimați conținutul hărții my_map pe consolă.
- Programul trebuie să returneze rezultate după finalizarea cu succes.
- Sfârșitul corpului funcției main().






