C ++

Cum se folosește C ++ Unordered Map

Cum se folosește C ++ Unordered Map
O hartă, cunoscută și sub numele de matrice asociativă, este o listă de elemente, în care fiecare element este o pereche cheie / valoare. Deci, fiecare cheie corespunde unei valori. Taste diferite pot avea aceeași valoare, pentru munca obișnuită. De exemplu, tastele pot fi o listă de fructe și valorile corespunzătoare, culorile fructelor. În C ++, harta este implementată ca o structură de date cu funcții și operatori membri. O hartă ordonată este una în care perechile de elemente au fost ordonate prin taste. O hartă neordonată este aceea în care nu există ordine. Acest articol explică modul de utilizare a hărții neordonate C ++, scrisă ca unordered_map. Aveți nevoie de cunoștințe în indicatorii C ++ pentru a înțelege acest articol. unordered_map face parte din biblioteca standard C ++.

Clasa și obiecte

O clasă este un set de variabile și funcții care funcționează împreună, unde variabilele nu au valori atribuite. Când valorile sunt atribuite variabilelor, clasa devine un obiect. Valori diferite date aceleiași clase rezultă în obiecte diferite; adică diferite obiecte sunt aceeași clasă cu valori diferite. Se spune că crearea unui obiect dintr-o clasă este instanțierea obiectului.

Numele, unordered_map, este o clasă. Un obiect creat din clasa unordered_map are un nume ales de programator.

O funcție care aparține unei clase este necesară pentru a crea un obiect din clasă. În C ++, acea funcție are același nume ca și numele clasei. Obiectele create (instanțiate) din clasă au nume diferite date de către programator.

Crearea unui obiect din clasă înseamnă construirea obiectului; înseamnă și instanțierea.

Un program C ++ care utilizează clasa unordered_map, începe cu următoarele linii în partea de sus a fișierului:

#include
#include
folosind spațiul de nume std;

Prima linie este pentru intrare / ieșire. A doua linie este de a permite programului să utilizeze toate caracteristicile clasei unordered_map. A treia linie permite programului să utilizeze numele din spațiul de nume standard.

Supraîncărcarea unei funcții

Când două sau mai multe semnături de funcții diferite au același nume, se spune că acel nume este suprasolicitat. Când se apelează o funcție, numărul și tipul argumentelor, determinați ce funcție este efectiv executată.

Construcție / Construire copiere

Construcție simplă

O hartă neordonată poate fi construită și atribuite valori după cum urmează:

harta_nordonată umap;
umap ["banana"] = "galben";
umap ["grape"] = "verde";
umap ["fig"] = "mov";

Declarația începe cu specializarea șablon cu tipurile pentru perechile cheie și valoare. Acesta este urmat de numele ales de programator pentru hartă; apoi un punct și virgulă. Al doilea segment de cod arată cum să atribuiți valorile cheilor lor.
Construcție după Initializer_list
Acest lucru se poate face după cum urmează:

harta_nordonată umap ("banana", "galben",
"strugure", "verde", "smochin", "purpuriu");

Construcție prin atribuirea Initializer_list
Exemplu:

harta_nordonată umap = "banana", "galben",
"strugure", "verde", "smochin", "purpuriu";

Construcție prin copierea unei alte unordered_map
Exemplu:

harta_nordonată umap1 ("banana", "galben",
"strugure", "verde", "smochin", "purpuriu");
harta_nordonată umap2 (umap1);

Perechea Element

Următorul cod arată cum să creați și să accesați elementul pereche:

pereche pr = 'd', "mare";
cout << pr.first << '\n';
cout << pr.second << '\n';

Ieșirea este:

d
mare

primul și al doilea sunt cuvinte rezervate pentru cele două elemente din pereche. Valorile din pereche pot fi în continuare modificate folosind prima și a doua.

O pereche este numită, value_type în subiectul hărții neordonate.

unordered_map Acces element

mapped_type & operator [] (key_type && k)
Returnează valoarea pentru cheia corespunzătoare. Exemplu:

harta_nordonată umap;
umap ["banana"] = "galben";
umap ["grape"] = "verde";
umap ["fig"] = "mov";
const char * ret = umap ["strugure"];
cout << ret <<'\n';

Ieșirea este: „verde”. Valorile pot fi atribuite în același mod - vezi mai sus.

unordered_map Capacitate

size_type size () const noexcept
Returnează numărul de perechi din hartă.

harta_nordonată umap;
umap ["banana"] = "galben";
umap ["grape"] = "verde";
umap ["fig"] = "mov";
cout << umap.size() <<'\n';

Ieșirea este 3.

bool empty () const noexcept

Returnează 1 pentru adevărat dacă harta nu are perechi și 0 pentru fals dacă are perechi. Exemplu:

harta_nordonată umap;
cout << umap.empty() <<'\n';

Ieșirea este 1.

Iteratorii care se întorc și clasa neordonată a hărții

Un iterator este ca un indicator, dar are mai multe funcționalități decât indicatorul.

begin () noexcept

Returnează un iterator care indică prima pereche a obiectului hartă, ca în următorul segment de cod:

harta_nordonată umap;
umap ["banana"] = "galben"; umap ["grape"] = "verde"; umap ["fig"] = "mov";
harta_nordonată:: iterator iter = umap.începe();
pereche pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Ieșirea este: smochin, violet. Harta este neordonată.

begin () const noexcept;

Returnează un iterator care indică primul element al colecției de obiecte hartă. Când construcția obiectului este precedată de const, expresia „begin () const” este executată în loc de „begin ()”. În această condiție, elementele din obiect nu pot fi modificate. De exemplu, este utilizat în următorul cod.

const unordered_map umap ("banana", "galben",
"strugure", "verde", "smochin", "purpuriu");
harta_nordonată:: const_iterator iter = umap.începe();
pereche pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Ieșirea este: smochin, violet. Harta este neordonată. Rețineți că const_iterator a fost folosit de această dată, în loc de doar iterator, pentru a primi iteratorul returnat.

end () noexcept

Returnează un iterator care indică imediat dincolo de ultimul element al obiectului hartă.

end () const noexcept

Returnează un iterator care indică imediat dincolo de ultimul element al obiectului hartă. Când construcția obiectului de hartă este precedată de const, expresia „end () const” este executată în locul „end ()”.

unordered_map Operațiuni

găsirea iteratorului (const key_type & k)

Caută o pereche de chei date în hartă. Dacă este găsit, returnează iteratorul. Dacă nu este găsit, returnează un iterator care indică sfârșitul hărții, care nu este o pereche. Următorul cod arată cum să utilizați această funcție membru:

harta_nordonată umap;
umap ['a'] = 'b'; umap ['c'] = 'd'; umap ['e'] = 'f';
harta_nordonată:: iterator iter = umap.găsi ('c');
dacă (umap.găsi ('c') != umap.Sfârșit())

pereche pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Ieșirea este: c, d

const_iterator găsi (const key_type & k) const;

Această versiune a funcției se numește, dacă crearea hărții neordonate începe cu const, făcând toate elementele hărții numai în citire.

unordered_map Modificatori

pereche insert (value_type && obj)
O hartă neordonată înseamnă că perechile nu sunt în nici o ordine. Deci, programul introduce perechea în orice loc consideră convenabil. Funcția revine, pereche. Dacă inserarea a avut succes, bool va fi 1 pentru adevărat, altfel ar fi 0 pentru fals. Dacă inserarea are succes, atunci iteratorul va indica elementul nou inserat. Următorul cod ilustrează utilizarea:

harta_nordonată umap;
umap ["banana"] = "galben";
umap ["grape"] = "verde";
umap ["fig"] = "mov";
umap.insert ("cireșe", "roșii", "căpșuni", "roșii");
cout << umap.size() << '\n';

Ieșirea este: 5. Pot fi inserate mai multe perechi.

size_type șterge (const key_type & k)

Această funcție șterge o pereche din unordered_map. Următorul segment de cod ilustrează:

harta_nordonată umap;
umap ["banana"] = "galben";
umap ["grape"] = "verde";
umap ["fig"] = "mov";
int num = umap.șterge („strugure”);
cout << umap.size() << '\n';

Ieșirea este 2.
swap de gol (unordered_map &)
Două hărți neordonate pot fi schimbate, așa cum este ilustrat în acest segment de cod:

harta_nordonată umap1 = "banana", "galben",
"struguri", "verzi", "smochini", "mov", "căpșuni", "roșii";
harta_nordonată umap2 = "cireș", "roșu", "tei", "verde";
umap1.swap (umap2);
harta_nordonată:: iterator iter1 = umap1.începe();
pereche pr1 = * iter1;
harta_nordonată:: iterator iter2 = umap2.începe();
pereche pr2 = * iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
harta_nordonată umap1 = "banana", "galben",
"struguri", "verzi", "smochini", "mov", "căpșuni", "roșii";
harta_nordonată umap2 = "cireș", "roșu", "tei", "verde";
umap1.swap (umap2);
harta_nordonată:: iterator iter1 = umap1.începe();
pereche pr1 = * iter1;
harta_nordonată:: iterator iter2 = umap2.începe();
pereche pr2 = * iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

Ieșirea este:

Prima cheie și dimensiunea umap1: var, 2

Prima cheie și dimensiunea căpșunii umap2, 4

Harta este neordonată. Rețineți că lungimea unei hărți este mărită, dacă este necesar. Tipurile de date trebuie să fie aceleași.

Class și obiectele sale instanțiate

O valoare este pentru un tip de date, așa cum un obiect instanțiat este pentru o clasă. Construcția hărții neordonate poate accepta, de asemenea, o clasă ca tip de date. Următorul program ilustrează acest lucru:

#include
#include
folosind spațiul de nume std;
clasa TheCla

public:
int num;
statice char ch;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

distracție de vid static (char ch)

if (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
harta_nordonată umap;
umap = "banana", obj1, "strugure", obj2, "fig", obj3, "strawberry", obj4, "lime", obj5;
cout << umap.size() << '\n';
retur 0;

Ieșirea este: 5.

Definiția clasei are două date publice și două funcții publice. În funcția main (), sunt instanțiate diferite obiecte pentru clasă. Apoi este instanțiată o hartă neordonată, în care fiecare pereche constă în numele unui fruct și un obiect din clasă. Se afișează dimensiunea hărții. Programul se compilează fără avertisment sau mesaj de eroare.

Aplicarea Hărții

Matricea asociază un index la valoare. Perechile cheie / valoare există în multe situații din viață, care pot fi programate. Perechea cheie / valoare fructe / culoare este doar un exemplu. Un alt exemplu este numele oamenilor și vârstele lor. În acest caz, perechea va fi de un tip, pereche. Poate fi și pereche. În acest din urmă caz, se va utiliza directiva de pre-procesare. O pereche cheie / valoare poate fi în continuare numele cuplurilor căsătorite. În țările în care există poligamie, vor exista diferite soții pentru un singur bărbat.

Formarea unei hărți

O hartă nu este o matrice bidimensională, cu două coloane. O hartă funcționează cu o funcție hash. Cheia este codificată de funcția hash, într-un număr întreg al unui tablou. Această matrice este cea care deține valorile. Deci, există de fapt o matrice cu valorile, iar cheile sunt mapate la indicii matricei, astfel încât corespondențele dintre chei și valori sunt făcute. Hashing este un subiect extins și nu este tratat în acest articol.

Concluzie

O hartă, cunoscută și sub numele de matrice asociativă, este o listă de elemente, în care fiecare element este o pereche cheie / valoare. Deci, fiecare cheie corespunde unei valori. În C ++, harta este implementată ca o structură de date cu funcții și operatori membri. O hartă ordonată este una în care perechile de elemente au fost ordonate prin taste. O hartă neordonată este aceea în care nu există ordine.

Din punct de vedere tehnic, un hash este format din perechi elemente. De fapt, perechea este o structură de date întreagă cu funcțiile și operatorii săi membri. Cei doi parametri șablon pentru pereche sunt aceiași doi parametri șablon pentru unordered_map.

Lista inițializatorului pentru hartă este o matrice literală a literelor. Fiecare literal intern este format din două obiecte, perechea cheie / valoare.

Funcțiile membre și operatorii pentru unordered_map pot fi clasificate în următoarele rubrici: unordered_map construction / copy copy, unordered_map Capacity, unordered_map iterator, unordered_map Operations și unordered_map Modifiers.

O hartă neordonată este utilizată atunci când o cheie trebuie mapată la o valoare.

Chrys

Cum se mărește FPS în Linux?
FPS înseamnă Cadre pe secundă. Sarcina FPS este de a măsura rata de cadre în redările video sau în performanțele jocului. În cuvinte simple, numărul d...
Cele mai bune jocuri Oculus App Lab
Dacă sunteți proprietarul căștilor Oculus, atunci trebuie să fiți informați despre încărcarea laterală. Încărcarea laterală este procesul de instalare...
Top 10 jocuri de jucat pe Ubuntu
Platforma Windows a fost una dintre platformele dominante pentru jocuri din cauza procentului imens de jocuri care se dezvoltă astăzi pentru a sprijin...