C ++

Kaip naudotis „C ++ Unordered Map“

Kaip naudotis „C ++ Unordered Map“
Žemėlapis, dar vadinamas asociaciniu masyvu, yra elementų sąrašas, kur kiekvienas elementas yra raktų / reikšmių pora. Taigi, kiekvienas raktas atitinka vertę. Skirtingi raktai gali turėti tą pačią vertę įprastam darbui. Pavyzdžiui, raktai gali būti vaisių sąrašas ir atitinkamos vertės, vaisių spalvos. C ++ sistemoje žemėlapis yra įgyvendinamas kaip duomenų struktūra su narių funkcijomis ir operatoriais. Sutvarkytas žemėlapis yra tas, kuriame elementų poros surikiuotos klavišais. Nesutvarkytas žemėlapis yra tas, kuriame nėra tvarkos. Šiame straipsnyje paaiškinta, kaip naudoti C ++ nesutvarkytą žemėlapį, parašytą kaip neužsakytas_ žemėlapis. Norint suprasti šį straipsnį, jums reikia žinių apie C ++ rodykles. unordered_map yra C ++ standartinės bibliotekos dalis.

Klasė ir objektai

Klasė yra kintamųjų ir funkcijų rinkinys, veikiantis kartu, kai kintamieji neturi priskirtų reikšmių. Kai kintamiesiems priskiriamos reikšmės, klasė tampa objektu. Skirtingos tos pačios klasės vertės suteikia skirtingus objektus; tai yra skirtingi objektai yra ta pati klasė su skirtingomis vertėmis. Sakoma, kad kuriant objektą iš klasės, objektas yra momentinis.

Pavadinimas, unordered_map, yra klasė. Objektas, sukurtas iš „unordered_map“ klasės, turi programuotojo pasirinktą vardą.

Klasei priklausanti funkcija reikalinga objektui iš klasės sukurti. Programoje C ++ ši funkcija turi tą patį pavadinimą kaip ir klasės pavadinimas. Objektai, sukurti (instancijuoti) iš klasės, turi skirtingus pavadinimus, kuriuos jiems suteikia programuotojas.

Objekto sukūrimas iš klasės reiškia objekto sukūrimą; tai taip pat reiškia akimirksnį.

C ++ programa, naudojanti „unordered_map“ klasę, prasideda šiomis eilutėmis failo viršuje:

# įtraukti
# įtraukti
naudojant vardų sritį std;

Pirmoji eilutė skirta įvesties / išvesties. Antroji eilutė - leisti programai naudoti visas „unordered_map“ klasės ypatybes. Trečioji eilutė leidžia programai naudoti vardus standartinėje vardų srityje.

Funkcijos perkrova

Kai du ar daugiau skirtingų funkcijų parašų turi tą patį pavadinimą, sakoma, kad šis vardas perkrautas. Kai iškviečiama viena funkcija, argumentų skaičius ir tipas nustato, kuri funkcija iš tikrųjų vykdoma.

Konstrukcijos / kopijos statyba

Paprasta konstrukcija

Nesutvarkytą žemėlapį galima susikurti ir priskirti reikšmes taip:

neužsakytas_žemėlapis umap;
umap ["bananas"] = "geltonas";
umap ["vynuogė"] = "žalia";
umap ["fig"] = "violetinė";

Deklaracija prasideda šablonų specializacija, nurodant raktų ir reikšmių porų tipus. Po to nurodomas programuotojo pasirinktas žemėlapio pavadinimas; tada kabliataškis. Antrasis kodo segmentas parodo, kaip priskirti reikšmes jų raktams.
Statyba pagal „Initializer_list“
Tai galima padaryti taip:

neužsakytas_žemėlapis umap ("bananas", "geltonas",
"vynuogė", "žalia", "fig", "violetinė");

Konstrukcija priskiriant Initializer_list
Pavyzdys:

neužsakytas_žemėlapis umap = "bananas", "geltonas",
"vynuogė", "žalia", "fig", "violetinė";

Statyba nukopijuojant kitą nesutvarkytą žemėlapį
Pavyzdys:

neužsakytas_žemėlapis umap1 ("bananas", "geltonas",
"vynuogė", "žalia", "fig", "violetinė");
neužsakytas_žemėlapis umap2 (umap1);

Pora Elementas

Šis kodas parodo, kaip sukurti ir pasiekti poros elementą:

pora pr = 'd', "jūra";
cout << pr.first << '\n';
cout << pr.second << '\n';

Rezultatas yra:

d
jūra

pirmas ir antras yra rezervuoti žodžiai dviem poros elementams. Poros reikšmes vis tiek galima pakeisti naudojant pirmąjį ir antrąjį.

Nesutvarkyto žemėlapio temoje vadinama pora „value_type“.

unordered_map Prieiga prie elemento

„mapped_type“ ir operatorius [] („key_type“ && k)
Grąžina atitinkamo rakto vertę. Pavyzdys:

neužsakytas_žemėlapis umap;
umap ["bananas"] = "geltonas";
umap ["vynuogė"] = "žalia";
umap ["fig"] = "violetinė";
const char * ret = umap ["vynuogė"];
cout << ret <<'\n';

Rezultatas: „žalia“. Vertybės gali būti priskirtos tokiu pačiu būdu - žr. Aukščiau.

unordered_map Talpa

size_type dydis () const noexcept
Pateikia porų skaičių žemėlapyje.

neužsakytas_žemėlapis umap;
umap ["bananas"] = "geltonas";
umap ["vynuogė"] = "žalia";
umap ["fig"] = "violetinė";
cout << umap.size() <<'\n';

Rezultatas yra 3.

Bool tuščias () const noexcept

Grąžina 1 už „true“, jei žemėlapyje nėra poros, ir 0 už „false“, jei jis turi poras. Pavyzdys:

neužsakytas_žemėlapis umap;
cout << umap.empty() <<'\n';

Rezultatas yra 1.

Grįžtantys iteratoriai ir nesutvarkytų žemėlapių klasė

Iteratorius yra tarsi rodyklė, tačiau turi daugiau funkcijų nei rodyklė.

pradėti () noexcept

Grąžina iteratorių, nukreipiantį į pirmąją žemėlapio objekto porą, kaip šiame kodo segmente:

neužsakytas_žemėlapis umap;
umap ["bananas"] = "geltonas"; umap ["vynuogė"] = "žalia"; umap ["fig"] = "violetinė";
neužsakytas_žemėlapis:: iteratorius iter = umap.pradėti ();
pora pr = * kartoti;
cout << pr.first << ", " << pr.second << '\n';

Rezultatas: figūra, violetinė. Žemėlapis nėra užsakytas.

pradėti () const noexcept;

Grąžina iteratorių, kuris nurodo pirmąjį žemėlapio objektų kolekcijos elementą. Kai prieš objekto konstrukciją yra „const“, vietoj „begin ()“ vykdoma išraiška „begin () const“. Esant tokiai sąlygai, objekto elementų modifikuoti negalima. Pavyzdžiui, jis naudojamas šiame kode.

const unordered_map umap ("bananas", "geltonas",
"vynuogė", "žalia", "fig", "violetinė");
neužsakytas_žemėlapis:: const_iterator iter = umap.pradėti ();
pora pr = * kartoti;
cout << pr.first << ", " << pr.second << '\n';

Rezultatas: figūra, violetinė. Žemėlapis nėra užsakytas. Atkreipkite dėmesį, kad grąžinamam iteratoriui priimti šį kartą buvo naudojamas „const_iterator“, o ne tik iteratorius.

pabaiga () noexcept

Pateikia iteratorių, kuris nurodo iškart už paskutinio žemėlapio objekto elemento.

end () const noexcept

Pateikia iteratorių, kuris nurodo iškart už paskutinio žemėlapio objekto elemento. Kai prieš žemėlapio objekto konstrukciją yra „const“, vietoj „end ()“ vykdoma išraiška „end () const“.

unordered_map operacijos

iteratoriaus radimas (const key_type & k)

Žemėlapyje ieško nurodyto rakto poros. Jei jis bus rastas, jis grąžins iteratorių. Jei nerandama, jis pateikia iteratorių, kuris nurodo žemėlapio galą, kuris nėra pora. Šis kodas parodo, kaip naudoti šią nario funkciją:

neužsakytas_žemėlapis umap;
umap ['a'] = 'b'; umap ['c'] = 'd'; umap ['e'] = 'f';
neužsakytas_žemėlapis:: iteratorius iter = umap.rasti ('c');
jei (umap.rasti („c“) != umap.galas())

pora pr = * kartoti;
cout << pr.first << ", " << pr.second << '\n';

Išvestis yra: c, d

const_iterator rasti (const key_type & k) const;

Ši funkcijos versija vadinama, jei nesutvarkyto žemėlapio kūrimas prasideda konst, todėl visi žemėlapio elementai tampa tik skaitomi.

unordered_map modifikatoriai

pora įterpti (value_type && obj)
Nesutvarkytas žemėlapis reiškia, kad poros nėra jokia tvarka. Taigi, programa įterpia porą bet kurioje jai patogioje vietoje. Funkcija grįžta, suporuokite. Jei įterpimas buvo sėkmingas, reikšmė „true“ bus 1, kitaip klaidinga reikšmė bus 0. Jei įterpimas sėkmingas, iteratorius nurodys naujai įterptą elementą. Šis kodas iliustruoja naudojimą:

neužsakytas_žemėlapis umap;
umap ["bananas"] = "geltonas";
umap ["vynuogė"] = "žalia";
umap ["fig"] = "violetinė";
umap.įterpti ("vyšnia", "raudona", "braškė", "raudona");
cout << umap.size() << '\n';

Išvestis yra: 5. Galima įterpti daugiau nei vieną porą.

size_type ištrinti (const key_type & k)

Ši funkcija ištrina porą iš „unordered_map“. Šis kodo segmentas iliustruoja:

neužsakytas_žemėlapis umap;
umap ["bananas"] = "geltonas";
umap ["vynuogė"] = "žalia";
umap ["fig"] = "violetinė";
int num = umap.ištrinti („vynuogė“);
cout << umap.size() << '\n';

Rezultatas yra 2.
negaliojantis apsikeitimas (unordered_map &)
Du nesutvarkyti žemėlapiai gali būti sukeisti, kaip parodyta šiame kodo segmente:

neužsakytas_žemėlapis umap1 = "bananas", "geltonas",
"vynuogė", "žalia", "fig", "violetinė", "braškė", "raudona";
neužsakytas_žemėlapis umap2 = "vyšnia", "raudona", "kalkės", "žalia";
umap1.apsikeitimas (umap2);
neužsakytas_žemėlapis:: iteratorius iter1 = umap1.pradėti ();
pora pr1 = * iter1;
neužsakytas_žemėlapis:: iteratorius iter2 = umap2.pradėti ();
pora 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';
neužsakytas_žemėlapis umap1 = "bananas", "geltonas",
"vynuogė", "žalia", "fig", "violetinė", "braškė", "raudona";
neužsakytas_žemėlapis umap2 = "vyšnia", "raudona", "kalkės", "žalia";
umap1.apsikeitimas (umap2);
neužsakytas_žemėlapis:: iteratorius iter1 = umap1.pradėti ();
pora pr1 = * iter1;
neužsakytas_žemėlapis:: iteratorius iter2 = umap2.pradėti ();
pora 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';

Rezultatas yra:

Pirmasis raktas ir umap1 dydis: kalkės, 2

Pirmasis umap2 braškių raktas ir dydis, 4

Žemėlapis nėra užsakytas. Atminkite, kad, jei reikia, žemėlapio ilgis padidinamas. Duomenų tipai turi būti vienodi.

Klasė ir jos momentiniai objektai

Vertė yra duomenų tipui, kaip momentinis objektas - klasei. Nesutvarkyta žemėlapio konstrukcija taip pat gali priimti klasę kaip duomenų tipą. Tai iliustruoja ši programa:

# įtraukti
# įtraukti
naudojant vardų sritį std;
klasė „TheCla“

vieša:
int num;
statinis char ch;
negaliojantis func (char cha, const char * str)

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

statinis tuštumas (char ch)

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

;
int main ()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
neužsakytas_žemėlapis umap;
umap = "bananas", obj1, "vynuogė", obj2, "fig", obj3, "braškė", obj4, "kalkės", obj5;
cout << umap.size() << '\n';
grąžinti 0;

Išvestis yra: 5.

Klasės apibrėžime yra du duomenų viešieji nariai ir dvi viešojo nario funkcijos. Pagrindinėje () funkcijoje yra skirtingi klasės objektai. Tuomet iš karto sutvarkomas nesutvarkytas žemėlapis, kuriame kiekvieną porą sudaro vaisiaus pavadinimas ir klasės objektas. Rodomas žemėlapio dydis. Programa kaupia be jokio įspėjimo ar klaidos pranešimo.

Žemėlapio taikymas

Masyvas susieja indeksą su verte. Raktų / vertybių poros egzistuoja daugelyje gyvenimo situacijų, kurias galima užprogramuoti. Pagrindinė vaisių / spalvų pora yra tik vienas pavyzdys. Kitas pavyzdys yra žmonių vardas ir jų amžius. Tokiu atveju pora bus tipo, pora. Tai taip pat gali būti pora. Pastaruoju atveju bus taikoma išankstinio apdorojimo direktyva. Raktų / vertybių pora vis tiek gali būti susituokusių porų vardai. Šalyse, kur yra poligamija, vienam vyrui bus skirtingos žmonos.

Žemėlapio formavimas

Žemėlapis nėra dviejų matmenų masyvas, turintis du stulpelius. Žemėlapis veikia su maišos funkcija. Raktas koduojamas funkcija maišos, į masyvo sveikąjį skaičių. Būtent šis masyvas turi vertes. Taigi, iš tikrųjų yra vienas masyvas su reikšmėmis, o raktai susiejami su masyvo rodikliais, todėl raktai ir reikšmės susiejami. Maišymas yra plati tema ir apie tai šiame straipsnyje nėra kalbama.

Išvada

Žemėlapis, dar vadinamas asociaciniu masyvu, yra elementų sąrašas, kur kiekvienas elementas yra raktų / reikšmių pora. Taigi, kiekvienas raktas atitinka vertę. C ++ sistemoje žemėlapis yra įgyvendinamas kaip duomenų struktūra su narių funkcijomis ir operatoriais. Sutvarkytas žemėlapis yra tas, kuriame elementų poros surikiuotos klavišais. Nesutvarkytas žemėlapis yra tas, kuriame nėra užsakymo.

Techniškai maiša susideda iš poros elementai. Tiesą sakant, pora yra visa duomenų struktūra su jos narių funkcijomis ir operatoriais. Du poros šablono parametrai yra tie patys du šablono parametrai, skirti „unordered_map“.

Žemėlapio inicializatorių sąrašas yra masyvo pažodinis pažodinis. Kiekvieną vidinį literalą sudaro du objektai, raktų / reikšmių pora.

Narių funkcijas ir operatorius, skirtus „unordered_map“, galima suskirstyti į šias antraštes: unordered_map konstravimas / kopijos konstravimas, unordered_map talpa, unordered_map iteratorius, unordered_map operacijos ir unordered_map modifikatoriai.

Nesutvarkytas žemėlapis naudojamas, kai raktą reikia susieti su reikšme.

Chrys

„OpenTTD“ pamoka
„OpenTTD“ yra vienas iš populiariausių verslo modeliavimo žaidimų. Šiame žaidime turite sukurti nuostabų transporto verslą. Tačiau pradėsite nuo mažda...
„SuperTuxKart“, skirta „Linux“
„SuperTuxKart“ yra puikus pavadinimas, sukurtas nemokamai suteikti „Mario Kart“ patirtį jūsų „Linux“ sistemoje. Tai gana sudėtinga ir smagu žaisti, yr...
„Battle for Wesnoth“ pamoka
„Battle for Wesnoth“ yra vienas populiariausių atvirojo kodo strateginių žaidimų, kurį šiuo metu galite žaisti. Šis žaidimas ne tik buvo kuriamas laba...