Kuidas kasutada C ++ tellimata kaarti

How Use C Unordered Map



Kaart, tuntud ka kui assotsiatiivne massiiv, on elementide loend, kus iga element on võtme/väärtuse paar. Seega vastab iga klahv väärtusele. Erinevatel klahvidel võib tavalise töö jaoks olla sama väärtus. Näiteks võtmed võivad olla puuviljade loend ja vastavad väärtused, puuviljade värvid. C ++ rakendatakse kaarti andmestruktuurina koos liikmefunktsioonide ja operaatoritega. Tellitud kaart on kaart, kus elementide paarid on järjestatud võtmete järgi. Korrastamata kaart on selline, kus pole korda. Selles artiklis selgitatakse, kuidas kasutada C ++ järjestamata kaarti, mis on kirjutatud kui unordered_map. Selle artikli mõistmiseks vajate C ++ näpunäidete tundmist. unordered_map on osa C ++ standardteegist.

Klass ja objektid

Klass on koos toimivate muutujate ja funktsioonide kogum, kus muutujatele pole määratud väärtusi. Kui muutujatele määratakse väärtused, muutub klass objektiks. Samale klassile antud erinevad väärtused annavad erinevaid objekte; see tähendab, et erinevad objektid on sama klass erinevate väärtustega. Klassist objekti loomine on objekti initsieerimine.







Nimi, unordered_map, on klass. Klassist unordered_map loodud objektil on programmeerija valitud nimi.



Funktsioon, mis kuulub klassi, on vajalik objekti klassist eraldamiseks. C ++ puhul on sellel funktsioonil sama nimi kui klassi nimel. Klassist loodud (näidatud) objektidel on programmeerija poolt antud erinevad nimed.



Klassist objekti loomine tähendab objekti konstrueerimist; see tähendab ka kohesust.





C ++ programm, mis kasutab klassi unordered_map, algab faili ülaosas järgmiste ridadega:

#kaasake
#kaasake
kasutades nimeruumi std;

Esimene rida on sisend/väljund. Teine rida on lubada programmil kasutada kõiki unordered_map klassi funktsioone. Kolmas rida võimaldab programmil kasutada standardse nimeruumi nimesid.



Funktsiooni ülekoormamine

Kui kahel või enamal erineval funktsiooniallkirjal on sama nimi, öeldakse, et see nimi on ülekoormatud. Ühe funktsiooni kutsumisel määrab argumentide arv ja tüüp kindlaks, milline funktsioon tegelikult täidetakse.

Ehitus/koopia ehitamine

Lihtne ehitus

Korrastamata kaarti saab koostada ja väärtused määrata järgmiselt.

tellimata_kaart<const süsi*, const süsi*>umap;

umap['banaan'] = 'kollane';
umap['viinamari'] = 'roheline';
umap['viigimari'] = 'lilla';

Deklaratsioon algab malli spetsialiseerumisega võtme- ja väärtuspaaride tüüpidega. Sellele järgneb programmeerija valitud nimi kaardile; siis semikoolon. Teine koodisegment näitab, kuidas nende võtmetele väärtusi määrata.
Ehitus Initializer_list
Seda saab teha järgmiselt.

tellimata_kaart<const süsi*, const süsi*>umap({{'banaan', 'kollane'},
{'viinamari', 'roheline'}, {'viigimari', 'lilla'}});

Ehitus, määrates Initializer_list
Näide:

tellimata_kaart<const süsi*, const süsi*>umap= {{'banaan', 'kollane'},
{'viinamari', 'roheline'}, {'viigimari', 'lilla'}};

Ehitus, kopeerides järjekordne tellimata_kaart
Näide:

tellimata_kaart<const süsi*, const süsi*>umap1({{'banaan', 'kollane'},
{'viinamari', 'roheline'}, {'viigimari', 'lilla'}});
tellimata_kaart<const süsi*, const süsi*>umap2(umap1);

Paar Element

Järgmine kood näitab, kuidas paarielementi luua ja sellele juurde pääseda:

paar<süsi, const süsi*>pr= {'d', 'ole'};
maksma<<pr.esimene << ' n';
maksma<<pr.teine << ' n';

Väljund on:

d
olla

esimene ja teine ​​on kahe paari jaoks reserveeritud sõnad. Paari väärtusi saab siiski muuta, kasutades esimest ja teist.

Korraldamata kaardi teemas nimetatakse paari, väärtus_tüüp.

unordered_map Elementide juurdepääs

kaardistatud_tüüp ja operaator [] (võtmetüüp && k)
Tagastab vastava võtme väärtuse. Näide:

tellimata_kaart<const süsi*, const süsi*>umap;

umap['banaan'] = 'kollane';
umap['viinamari'] = 'roheline';
umap['viigimari'] = 'lilla';

const süsi *õige=umap['viinamari'];

maksma<<õige<<' n';

Väljund on: roheline. Väärtusi saab määrata samamoodi - vt eespool.

unordered_map Maht

size_type size () const noexcept
Tagastab paaride arvu kaardil.

tellimata_kaart<const süsi*, const süsi*>umap;

umap['banaan'] = 'kollane';
umap['viinamari'] = 'roheline';
umap['viigimari'] = 'lilla';

maksma<<umap.suurus() <<' n';

Väljund on 3.

bool empty () const noexcept

Tagastab 1 väärtuse tõene, kui kaardil pole paari, ja 0 väärtuse vale, kui sellel on paarid. Näide:

tellimata_kaart<const süsi*, const süsi*>umap;
maksma<<umap.tühi() <<' n';

Väljund on 1.

Tagasipöörduvad iteraatorid ja järjestamata kaardiklass

Iteraator on nagu osuti, kuid sellel on rohkem funktsioone kui osuti.

algus () noexcept

Tagastab iteraatori, mis osutab kaardiobjekti esimesele paarile, nagu järgmises koodisegmendis:

tellimata_kaart<const süsi*, const süsi*>umap;

umap['banaan'] = 'kollane';umap['viinamari'] = 'roheline';umap['viigimari'] = 'lilla';

tellimata_kaart<const süsi*, const süsi*> ::iteraatoriter=umap.alustada();
paar<const süsi*, const süsi*>pr= *iter;
maksma<<pr.esimene << ',' <<pr.teine << ' n';

Väljund on: viigimari, lilla. Kaart on tellimata.

begin () const noexcept;

Tagastab iteraatori, mis osutab kaardiobjektide kogu esimesele elemendile. Kui objekti konstrueerimisele eelneb konst, käivitatakse avaldise algus () const asemel algus (). Selle tingimuse korral ei saa objekti elemente muuta. Seda kasutatakse näiteks järgmises koodis.

consttellimata_kaart<const süsi*, const süsi*>umap({{'banaan', 'kollane'},
{'viinamari', 'roheline'}, {'viigimari', 'lilla'}});

tellimata_kaart<const süsi*, const süsi*> ::const_iteratoriter=umap.alustada();
paar<const süsi*, const süsi*>pr= *iter;
maksma<<pr.esimene << ',' <<pr.teine << ' n';

Väljund on: viigimari, lilla. Kaart on tellimata. Pange tähele, et tagastatud iteraatori vastuvõtmiseks on seekord kasutatud mitte ainult iteraatorit, vaid const_iteratorit.

end () noexcept

Tagastab iteraatori, mis osutab vahetult kaardi objekti viimase elemendi taha.

end () const noexcept

Tagastab iteraatori, mis osutab vahetult kaardi objekti viimase elemendi taha. Kui kaardiobjekti ehitusele eelneb const, täidetakse end () asemel avaldist end () const.

unordered_map toimingud

iteraatori leidmine (const key_type & k)

Otsib kaardilt antud võtmepaari. Kui see leitakse, tagastab see iteraatori. Kui seda ei leita, tagastab see iteraatori, mis osutab kaardi lõppu, mis ei ole paar. Järgmine kood näitab, kuidas seda liikmefunktsiooni kasutada:

tellimata_kaart<süsi,süsi>umap;

umap[''] = 'b';umap['c'] = 'd';umap['Ja'] = 'f';

tellimata_kaart<süsi,süsi> ::iteraatoriter=umap.leida('c');
kui (umap.leida('c') ! =umap.lõpp())
{
paar<süsi,süsi>pr= *iter;
maksma<<pr.esimene << ',' <<pr.teine << ' n';
}

Väljund on: c, d

const_iterator find (const key_type & k) const;

Funktsiooni seda versiooni nimetatakse, kui järjestamata kaardi loomine algab Const-ga, muutes kaardi kõik elemendid kirjutuskaitstud.

unordered_map Modifiers

paari sisestus (väärtustüüp && obj)
Korrastamata kaart tähendab, et paarid pole mingis järjekorras. Niisiis, programm lisab paari mis tahes sobivasse kohta. Funktsioon naaseb, paarista. Kui sisestamine õnnestus, on bool 1 tõese väärtuse korral, vastasel juhul on väärtus 0 vale. Kui sisestamine õnnestus, osutab iteraator äsja sisestatud elemendile. Kasutamist illustreerib järgmine kood:

tellimata_kaart<const süsi*, const süsi*>umap;

umap['banaan'] = 'kollane';
umap['viinamari'] = 'roheline';
umap['viigimari'] = 'lilla';

umap.sisestada({{'kirss', 'võrk'}, {'maasikas', 'võrk'}});

maksma<<umap.suurus() << ' n';

Väljund on järgmine: 5. Sisestada saab rohkem kui ühe paari.

suuruse_tüübi kustutamine (const key_type & k)

See funktsioon kustutab paari järjestamata_kaardilt. Järgmine koodisegment illustreerib:

tellimata_kaart<const süsi*, const süsi*>umap;

umap['banaan'] = 'kollane';
umap['viinamari'] = 'roheline';
umap['viigimari'] = 'lilla';

intühe peale=umap.kustutada('viinamari');

maksma<<umap.suurus() << ' n';

Väljund on 2.
tühine vahetus (järjestamata_kaart &)
Kahte järjestamata kaarti saab vahetada, nagu on näidatud selles koodisegmendis:

tellimata_kaart<const süsi*, const süsi*>umap1= {{'banaan', 'kollane'},
{'viinamari', 'roheline'}, {'viigimari', 'lilla'}, {'maasikas', 'võrk'}};

tellimata_kaart<const süsi*, const süsi*>umap2= {{'kirss', 'võrk'}, {'lubi', 'roheline'}};

umap1.vahetada(umap2);

tellimata_kaart<const süsi*, const süsi*> ::iteraatoriter1=umap1.alustada();
paar<const süsi*, const süsi*>pr1= *iter1;
tellimata_kaart<const süsi*, const süsi*> ::iteraatoriter2=umap2.alustada();
paar<const süsi*, const süsi*>pr2= *iter2;

maksma<< 'Esimene võti ja umap1 suurus:'<<pr1.esimene <<','<<umap1.suurus() << ' n';
maksma<< 'Esimene võti ja umap2 suurus'<<pr2.esimene <<','<<umap2.suurus() << ' n';
tellimata_kaart<const süsi*, const süsi*>umap1= {{'banaan', 'kollane'},
{'viinamari', 'roheline'}, {'viigimari', 'lilla'}, {'maasikas', 'võrk'}};
tellimata_kaart<const süsi*, const süsi*>umap2= {{'kirss', 'võrk'}, {'lubi', 'roheline'}};

umap1.vahetada(umap2);

tellimata_kaart<const süsi*, const süsi*> ::iteraatoriter1=umap1.alustada();
paar<const süsi*, const süsi*>pr1= *iter1;
tellimata_kaart<const süsi*, const süsi*> ::iteraatoriter2=umap2.alustada();
paar<const süsi*, const süsi*>pr2= *iter2;

maksma<< 'Esimene võti ja umap1 suurus:'<<pr1.esimene <<','<<umap1.suurus() << ' n';
maksma<< 'Esimene võti ja umap2 suurus'<<pr2.esimene <<','<<umap2.suurus() << ' n';

Väljund on:

Esimene võti ja umap1 suurus: lubi, 2

Esimene võti ja umap2 maasika suurus, 4

Kaart on tellimata. Pange tähele, et vajadusel suurendatakse kaardi pikkust. Andmetüübid peavad olema samad.

Klass ja selle installeeritud objektid

Väärtus on andmetüübile, nagu klassifitseeritud objekt klassile. Korraldamata kaardikonstruktsioon võib ka andmetüübina klassi vastu võtta. Seda illustreerib järgmine programm:

#kaasake
#kaasake
kasutades nimeruumi std;

klass TheCla
{
avalik:
intühe peale;
staatiline süsich;

tühinefunktsiooni(süsiei, const süsi *lk)
{
maksma<< 'Seal on ' <<ühe peale<< 'väärt raamatud' <<ei<<lk<< ' poes.' << ' n';
}
staatiline tühinelõbus(süsich)
{
kui (ch== '')
maksma<< „Staatilise liikme ametlik funktsioon” << ' n';
}
};

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

tellimata_kaart<const süsi*,TheCla>umap;
umap= {{'banaan',obj1}, {'viinamari',obj2}, {'viigimari',obj3}, {'maasikas',obj4}, {'lubi',obj5}};

maksma<<umap.suurus() << ' n';

tagasi 0;
}

Väljund on: 5.

Klassi definitsioonil on kaks andmete avalikku liiget ja kaks avaliku liikme funktsiooni. Funktsioonis main () funktsioonis klassiseeritakse klassi erinevaid objekte. Seejärel kuvatakse korrastamata kaart, kus iga paar koosneb puuvilja ja klassi eseme nimest. Kuvatakse kaardi suurus. Programm kompileeritakse ilma hoiatus- ja veateadeta.

Kaardi rakendamine

Massiiv seostab indeksi väärtusega. Võtme/väärtuse paarid eksisteerivad paljudes elusituatsioonides, mida saab programmeerida. Puu/värvi võtme/väärtuse paar on vaid üks näide. Teine näide on inimeste nimed ja nende vanus. Sel juhul on paar tüüpi, paar. See võib olla ka paariline. Viimasel juhul kasutatakse eeltöötlusdirektiivi. Võtme/väärtuse paariks võivad ikkagi olla abielupaaride nimed. Riikides, kus on polügaamia, on ühe mehe jaoks erinevad naised.

Kaardi moodustamine

Kaart ei ole kahemõõtmeline massiiv, millel on kaks veergu. Kaart töötab räsifunktsiooniga. Võti kodeeritakse räsifunktsiooniga massiivi täisarvuks. Just see massiiv hoiab väärtusi. Niisiis, tegelikult on väärtustega üks massiiv ja võtmed kaardistatakse massiivi indeksitega ja nii tehakse klahvide ja väärtuste vastavus. Räsimine on ulatuslik teema ja seda käesolevas artiklis ei käsitleta.

Järeldus

Kaart, tuntud ka kui assotsiatiivne massiiv, on elementide loend, kus iga element on võtme/väärtuse paar. Seega vastab iga klahv väärtusele. C ++ rakendatakse kaarti andmestruktuurina koos liikmefunktsioonide ja operaatoritega. Tellitud kaart on kaart, kus elementide paarid on järjestatud võtmete järgi. Korrastamata kaart on selline, kus tellimist ei toimu.

Tehniliselt koosneb räsi paarielementidest. Tegelikult on paar terve andmestruktuur koos liikmesfunktsioonide ja operaatoritega. Paari kaks malliparameetrit on samad kaks malli parameetrit tellimata_kaardi jaoks.

Kaardi initsialiseerimisnimekiri on literaalide massiivi literaal. Iga sisemine literaal koosneb kahest objektist, võtme/väärtuse paarist.

Korraldamata_kaardi liikmefunktsioone ja operaatoreid saab liigitada järgmiste pealkirjade alla: tellimata_kaardi ehitus/koopiakonstrueerimine, unordered_map Capacity, unordered_map iterator, unordered_map Operations ja unordered_map Modifiers.

Korraldamata kaarti kasutatakse siis, kui võti tuleb väärtusele kaardistada.

Chrys