Kā lietot C ++ nesakārtoto karti

How Use C Unordered Map



Karte, kas pazīstama arī kā asociatīvs masīvs, ir elementu saraksts, kur katrs elements ir atslēgu/vērtību pāris. Tātad katra atslēga atbilst vērtībai. Dažādiem taustiņiem var būt vienāda vērtība parastajam darbam. Piemēram, atslēgas var būt augļu saraksts un atbilstošās vērtības, augļu krāsas. C ++ karte tiek īstenota kā datu struktūra ar dalībnieku funkcijām un operatoriem. Pasūtīta karte ir tā, kur elementu pāri ir sakārtoti pēc atslēgām. Nesakārtota karte ir karte, kurā nav kārtības. Šajā rakstā ir paskaidrots, kā izmantot C ++ nesakārtoto karti, kas rakstīta kā unordered_map. Lai saprastu šo rakstu, jums ir nepieciešamas zināšanas C ++ rādītājos. unordered_map ir daļa no C ++ standarta bibliotēkas.

Klase un objekti

Klase ir mainīgo un funkciju kopums, kas darbojas kopā, ja mainīgajiem nav piešķirtas vērtības. Kad mainīgajiem tiek piešķirtas vērtības, klase kļūst par objektu. Dažādas vērtības, kas piešķirtas vienai klasei, rada dažādus objektus; tas ir, dažādi objekti ir viena klase ar dažādām vērtībām. Tiek uzskatīts, ka objekta izveide no klases ir objekta eksponēšana.







Vārds, unordered_map, ir klase. Objektam, kas izveidots no klases unordered_map, ir programmētāja izvēlēts nosaukums.



Funkcija, kas pieder klasei, ir nepieciešama, lai parādītu objektu no klases. C ++ šai funkcijai ir tāds pats nosaukums kā klases nosaukumam. No klases izveidotajiem (paraugajiem) objektiem programmētājs ir piešķīris dažādus nosaukumus.



Izveidot objektu no klases nozīmē konstruēt objektu; tas nozīmē arī momentānošanu.





C ++ programma, kas izmanto klasi unordered_map, sākas ar šādām rindām faila augšdaļā:

#iekļaut
#iekļaut
izmantojot nosaukumvietas std;

Pirmā rinda ir paredzēta ievadīšanai/izvadīšanai. Otrā rinda ir ļaut programmai izmantot visas klases unordered_map funkcijas. Trešā rinda ļauj programmai izmantot nosaukumus standarta nosaukumu telpā.



Funkcijas pārslodze

Ja diviem vai vairākiem dažādu funkciju parakstiem ir vienāds nosaukums, tiek uzskatīts, ka šis nosaukums ir pārslogots. Izsaucot vienu funkciju, argumentu skaits un veids nosaka, kura funkcija tiek faktiski izpildīta.

Būvniecība/kopēšana

Vienkārša konstrukcija

Nesakārtotu karti var izveidot un piešķirt vērtības šādi:

unordered_map<konst char*, konst char*>umap;

umap['banāns'] = 'dzeltens';
umap['vīnogas'] = 'zaļš';
umap['vīģe'] = 'violets';

Deklarācija sākas ar veidnes specializāciju ar atslēgu un vērtību pāru veidiem. Tam seko programmētāja izvēlētais kartes nosaukums; tad semikolu. Otrais koda segments parāda, kā atslēgām piešķirt vērtības.
Būvniecība pēc Initializer_list
To var izdarīt šādi:

unordered_map<konst char*, konst char*>umap({{'banāns', 'dzeltens'},
{'vīnogas', 'zaļš'}, {'vīģe', 'violets'}});

Būvniecība, piešķirot Initializer_list
Piemērs:

unordered_map<konst char*, konst char*>umap= {{'banāns', 'dzeltens'},
{'vīnogas', 'zaļš'}, {'vīģe', 'violets'}};

Būvniecība, nokopējot citu nekārtotu karti
Piemērs:

unordered_map<konst char*, konst char*>umap1({{'banāns', 'dzeltens'},
{'vīnogas', 'zaļš'}, {'vīģe', 'violets'}});
unordered_map<konst char*, konst char*>umap2(umap1);

Pāris Element

Šis kods parāda, kā izveidot un piekļūt pāra elementam:

pāri<char, konst char*>pr= {'d', 'esi'};
izmaksas<<pr.pirmais << ' n';
izmaksas<<pr.otrais << ' n';

Rezultāts ir šāds:

d
būt

pirmais un otrais ir rezervēti vārdi abiem pāra priekšmetiem. Pāra vērtības joprojām var mainīt, izmantojot pirmo un otro.

Nesakārtotās kartes tēmā tiek saukts pāris, value_type.

unordered_map Piekļuve elementiem

mapped_type & operator [] (key_type && k)
Atgriež atbilstošās atslēgas vērtību. Piemērs:

unordered_map<konst char*, konst char*>umap;

umap['banāns'] = 'dzeltens';
umap['vīnogas'] = 'zaļš';
umap['vīģe'] = 'violets';

konst char *taisnība=umap['vīnogas'];

izmaksas<<taisnība<<' n';

Rezultāts ir: zaļš. Vērtības var piešķirt tādā pašā veidā - skatīt iepriekš.

unordered_map Jauda

size_type size () const noexcept
Atgriež pāru skaitu kartē.

unordered_map<konst char*, konst char*>umap;

umap['banāns'] = 'dzeltens';
umap['vīnogas'] = 'zaļš';
umap['vīģe'] = 'violets';

izmaksas<<umap.Izmērs() <<' n';

Izeja ir 3.

bool empty () const noexcept

Atgriež 1, ja kartei nav pāra, un 0 - nepatiesu, ja tai ir pāri. Piemērs:

unordered_map<konst char*, konst char*>umap;
izmaksas<<umap.tukšs() <<' n';

Izeja ir 1.

Atgriešanās atkārtotāji un nesakārtoto karšu klase

Iterators ir kā rādītājs, bet tam ir vairāk funkcionalitātes nekā rādītājam.

start () noexcept

Atgriež iteratoru, kas norāda uz kartes objekta pirmo pāri, kā norādīts šādā koda segmentā:

unordered_map<konst char*, konst char*>umap;

umap['banāns'] = 'dzeltens';umap['vīnogas'] = 'zaļš';umap['vīģe'] = 'violets';

unordered_map<konst char*, konst char*> ::iteratorsiter=umap.sākt();
pāri<konst char*, konst char*>pr= *iter;
izmaksas<<pr.pirmais << ',' <<pr.otrais << ' n';

Rezultāts ir: vīģe, violeta. Karte nav pasūtīta.

begin () const noexcept;

Atgriež iteratoru, kas norāda uz kartes objektu kolekcijas pirmo elementu. Ja pirms objekta konstrukcijas ir const, izteiksme begin () const tiek izpildīta, nevis begin (). Šādā gadījumā objekta elementus nevar mainīt. Piemēram, tas tiek izmantots šādā kodā.

konstunordered_map<konst char*, konst char*>umap({{'banāns', 'dzeltens'},
{'vīnogas', 'zaļš'}, {'vīģe', 'violets'}});

unordered_map<konst char*, konst char*> ::const_iteratoriter=umap.sākt();
pāri<konst char*, konst char*>pr= *iter;
izmaksas<<pr.pirmais << ',' <<pr.otrais << ' n';

Rezultāts ir: vīģe, violeta. Karte nav pasūtīta. Ņemiet vērā, ka atgrieztā iteratora saņemšanai šoreiz tika izmantots const_iterator, nevis tikai iterators.

end () noexcept

Atgriež iteratoru, kas norāda tieši aiz kartes objekta pēdējā elementa.

end () const noexcept

Atgriež iteratoru, kas norāda tieši aiz kartes objekta pēdējā elementa. Ja pirms kartes objekta konstrukcijas ir const, izteiksme end () const tiek izpildīta, nevis end ().

unordered_map operācijas

iteratora atrašana (const key_type & k)

Meklē kartē doto atslēgu pāri. Ja tas tiek atrasts, tas atgriež iteratoru. Ja tas netiek atrasts, tas atgriež iteratoru, kas norāda uz kartes beigām, kas nav pāris. Šis kods parāda, kā izmantot šo dalībnieka funkciju:

unordered_map<char,char>umap;

umap['uz'] = 'b';umap['c'] = 'd';umap['Un'] = 'f';

unordered_map<char,char> ::iteratorsiter=umap.atrast('c');
ja (umap.atrast('c') ! =umap.beigas())
{
pāri<char,char>pr= *iter;
izmaksas<<pr.pirmais << ',' <<pr.otrais << ' n';
}

Rezultāts ir: c, d

const_iterator atrast (const key_type & k) const;

Šī funkcijas versija tiek saukta, ja nesakārtotas kartes izveide sākas ar const, padarot visus kartes elementus tikai lasāmus.

unordered_map Modifiers

pāra ieliktnis (value_type && obj)
Nesakārtota karte nozīmē, ka pāri nav sakārtoti. Tātad, programma ievieto pāri jebkurā vietā, kas tai šķiet ērta. Funkcija atgriežas, savienojiet pārī. Ja ievietošana bija veiksmīga, bool būs 1 par patiesu, pretējā gadījumā tas būtu 0 par nepatiesu. Ja ievietošana ir veiksmīga, iterators norāda uz tikko ievietoto elementu. Šis kods ilustrē lietošanu:

unordered_map<konst char*, konst char*>umap;

umap['banāns'] = 'dzeltens';
umap['vīnogas'] = 'zaļš';
umap['vīģe'] = 'violets';

umap.ielikt({{'ķirsis', 'tīkls'}, {'zemene', 'tīkls'}});

izmaksas<<umap.Izmērs() << ' n';

Rezultāts ir šāds: 5. Var ievietot vairāk nekā vienu pāri.

izmēra_tipa dzēšana (const key_type & k)

Šī funkcija izdzēš pāri no unordered_map. Šis koda segments ilustrē:

unordered_map<konst char*, konst char*>umap;

umap['banāns'] = 'dzeltens';
umap['vīnogas'] = 'zaļš';
umap['vīģe'] = 'violets';

intuz vienu=umap.dzēst('vīnogas');

izmaksas<<umap.Izmērs() << ' n';

Izeja ir 2.
void swap (unordered_map &)
Var nomainīt divas nesakārtotas kartes, kā parādīts šajā koda segmentā:

unordered_map<konst char*, konst char*>umap1= {{'banāns', 'dzeltens'},
{'vīnogas', 'zaļš'}, {'vīģe', 'violets'}, {'zemene', 'tīkls'}};

unordered_map<konst char*, konst char*>umap2= {{'ķirsis', 'tīkls'}, {'laims', 'zaļš'}};

umap1.apmainīt(umap2);

unordered_map<konst char*, konst char*> ::iteratorsiter1=umap1.sākt();
pāri<konst char*, konst char*>pr1= *iter1;
unordered_map<konst char*, konst char*> ::iteratorsiter2=umap2.sākt();
pāri<konst char*, konst char*>pr2= *iter2;

izmaksas<< 'Pirmā atslēga un umap1 lielums:'<<pr1.pirmais <<','<<umap1.Izmērs() << ' n';
izmaksas<< 'Pirmā atslēga un umap2 lielums'<<pr2.pirmais <<','<<umap2.Izmērs() << ' n';
unordered_map<konst char*, konst char*>umap1= {{'banāns', 'dzeltens'},
{'vīnogas', 'zaļš'}, {'vīģe', 'violets'}, {'zemene', 'tīkls'}};
unordered_map<konst char*, konst char*>umap2= {{'ķirsis', 'tīkls'}, {'laims', 'zaļš'}};

umap1.apmainīt(umap2);

unordered_map<konst char*, konst char*> ::iteratorsiter1=umap1.sākt();
pāri<konst char*, konst char*>pr1= *iter1;
unordered_map<konst char*, konst char*> ::iteratorsiter2=umap2.sākt();
pāri<konst char*, konst char*>pr2= *iter2;

izmaksas<< 'Pirmā atslēga un umap1 lielums:'<<pr1.pirmais <<','<<umap1.Izmērs() << ' n';
izmaksas<< 'Pirmā atslēga un umap2 lielums'<<pr2.pirmais <<','<<umap2.Izmērs() << ' n';

Rezultāts ir šāds:

Pirmā atslēga un umap1 izmērs: kaļķis, 2

Pirmā atslēga un umap2 zemeņu izmērs, 4

Karte nav pasūtīta. Ņemiet vērā, ka nepieciešamības gadījumā kartes garums tiek palielināts. Datu veidiem jābūt vienādiem.

Klase un tās ieviestie objekti

Vērtība attiecas uz datu tipu, tāpat kā eksponēts objekts - uz klasi. Nesakārtota kartes konstrukcija var arī pieņemt klasi kā datu tipu. Šī programma to ilustrē:

#iekļaut
#iekļaut
izmantojot nosaukumvietas std;

klase TheCla
{
publiski:
intuz vienu;
statisks charch;

spēkā neesošsfunkciju(char, konst char *lpp)
{
izmaksas<< 'Tur ir ' <<uz vienu<< 'grāmatas vērts' <<<<lpp<< 'veikalā.' << ' n';
}
statisks spēkā neesošsjautri(charch)
{
ja (ch== 'uz')
izmaksas<< “Oficiālā statiskā dalībnieka funkcija” << ' n';
}
};

intgalvenais()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<konst char*,TheCla>umap;
umap= {{'banāns',obj1}, {'vīnogas',obj2}, {'vīģe',obj3}, {'zemene',obj4}, {'laims',obj5}};

izmaksas<<umap.Izmērs() << ' n';

atgriezties 0;
}

Rezultāts ir: 5.

Klases definīcijai ir divi datu publiskie dalībnieki un divas publiskā dalībnieka funkcijas. Galvenajā () funkcijā tiek parādīti dažādi klases objekti. Pēc tam tiek parādīta nesakārtota karte, kurā katrs pāris sastāv no augļa nosaukuma un klases objekta. Tiek parādīts kartes izmērs. Programma tiek apkopota bez brīdinājuma vai kļūdas ziņojuma.

Kartes pielietojums

Masīvs indeksam saista vērtību. Atslēgu/vērtību pāri pastāv daudzās dzīves situācijās, kuras var ieprogrammēt. Augļu/krāsu atslēgu/vērtību pāris ir tikai viens piemērs. Vēl viens piemērs ir cilvēku vārdi un viņu vecums. Šajā gadījumā pāris būs tipa, pāra. Tas var būt arī pāri. Pēdējā gadījumā tiks izmantota priekšapstrādes direktīva. Atslēgu/vērtību pāris joprojām var būt precētu pāru vārdi. Valstīs, kur ir daudzsievība, vienam vīrietim būs dažādas sievas.

Kartes veidošana

Karte nav divdimensiju masīvs ar divām kolonnām. Karte darbojas ar jaukšanas funkciju. Atslēgu kodē ar jaukšanas funkciju masīva veselam skaitlim. Tieši šis masīvs glabā vērtības. Tātad patiesībā ir viens masīvs ar vērtībām, un atslēgas tiek kartētas uz masīva indeksiem, un tādējādi tiek izveidotas atbilstības starp atslēgām un vērtībām. Jaukšana ir plaša tēma, un šajā rakstā tā nav apskatīta.

Secinājums

Karte, kas pazīstama arī kā asociatīvs masīvs, ir elementu saraksts, kur katrs elements ir atslēgu/vērtību pāris. Tātad katra atslēga atbilst vērtībai. C ++ karte tiek īstenota kā datu struktūra ar dalībnieku funkcijām un operatoriem. Pasūtīta karte ir tā, kur elementu pāri ir sakārtoti pēc atslēgām. Nesakārtota karte ir karte, kurā nav pasūtījumu.

Tehniski hash sastāv no pāra elementiem. Faktiski pāris ir vesela datu struktūra ar tās dalībnieku funkcijām un operatoriem. Abi veidnes parametri pārim ir tie paši divi veidnes parametri kartotnei unordered_map.

Kartes inicializācijas_saraksts ir literālu masīva literālis. Katrs iekšējais literāls sastāv no diviem objektiem, atslēgu/vērtību pāra.

Biedru funkcijas un operatorus unordered_map var iedalīt šādās pozīcijās: unordered_map construction/copy konstruēšana, unordered_map Capacity, unordered_map iterator, unordered_map Operations un unordered_map Modifiers.

Nesakārtota karte tiek izmantota, ja atslēga ir jāsaskaņo ar vērtību.

Chrys