Järjestämättömän C ++ -kartan käyttäminen

How Use C Unordered Map



Kartta, joka tunnetaan myös nimellä assosiatiivinen taulukko, on luettelo elementeistä, joissa jokainen elementti on avain/arvo -pari. Jokainen avain vastaa siis arvoa. Eri näppäimillä voi olla sama arvo tavallista työtä varten. Avaimet voivat esimerkiksi olla luettelo hedelmistä ja niitä vastaavat arvot, hedelmien värit. C ++: ssa kartta toteutetaan tietorakenteena jäsenfunktioilla ja operaattoreilla. Tilattu kartta on kartta, jossa elementtiparit on järjestetty avaimilla. Järjestämätön kartta on sellainen, jossa ei ole järjestystä. Tässä artikkelissa kerrotaan, kuinka käyttää järjestämätöntä C ++ -karttaa, joka on kirjoitettu muotoon unordered_map. Tarvitset tietoa C ++ -osoittimista ymmärtääksesi tämän artikkelin. unordered_map on osa C ++ -kirjastoa.

Luokka ja esineet

Luokka on joukko muuttujia ja funktioita, jotka toimivat yhdessä ja joissa muuttujille ei ole määritetty arvoja. Kun muuttujille on määritetty arvot, luokasta tulee objekti. Samalle luokalle annetut eri arvot johtavat eri objekteihin; eli eri objektit ovat sama luokka, jolla on erilaiset arvot. Objektin luominen luokasta sanotaan objektin havainnollistamiseksi.







Nimi, unordered_map, on luokka. Unordered_map -luokasta luodulla objektilla on ohjelmoijan valitsema nimi.



Toiminto, joka kuuluu luokkaan, tarvitaan objektin luontiin luokasta. C ++: ssa kyseisellä funktiolla on sama nimi kuin luokan nimellä. Luokasta luoduilla (näytteillä) olevilla objekteilla on eri nimet, jotka ohjelmoija on antanut heille.



Objektin luominen luokasta tarkoittaa objektin rakentamista; se tarkoittaa myös hetkellistämistä.





C ++ -ohjelma, joka käyttää luokkaa unordered_map, alkaa seuraavilla riveillä tiedoston yläosassa:

#sisältää
#sisältää
käyttämällä nimiavaruuden std;

Ensimmäinen rivi on tulo/lähtö. Toinen rivi on antaa ohjelman käyttää kaikkia luokan unordered_map ominaisuuksia. Kolmannella rivillä ohjelma voi käyttää nimiä normaalissa nimitilassa.



Toiminnon ylikuormitus

Kun kahdella tai useammalla eri funktion allekirjoituksella on sama nimi, sen sanotaan olevan ylikuormitettu. Kun yksi funktio kutsutaan, argumenttien määrä ja tyyppi määrittävät, mikä funktio todella suoritetaan.

Rakentaminen/Kopiointi

Yksinkertainen rakenne

Järjestämätön kartta voidaan rakentaa ja antaa arvot seuraavasti:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;

umap['banaani'] = 'keltainen';
umap['rypäle'] = 'vihreä';
umap['kuva'] = 'violetti';

Ilmoitus alkaa mallin erikoistumisella avain- ja arvoparien tyypeillä. Tätä seuraa ohjelmoijan valitsema nimi kartalle; sitten puolipiste. Toinen koodisegmentti näyttää, kuinka arvot annetaan niiden avaimille.
Rakentaja Initializer_list
Tämä voidaan tehdä seuraavasti:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap({{'banaani', 'keltainen'},
{'rypäle', 'vihreä'}, {'kuva', 'violetti'}});

Rakentaminen määrittämällä Initializer_list
Esimerkki:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap= {{'banaani', 'keltainen'},
{'rypäle', 'vihreä'}, {'kuva', 'violetti'}};

Rakentaminen kopioimalla toinen unordered_map
Esimerkki:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap1({{'banaani', 'keltainen'},
{'rypäle', 'vihreä'}, {'kuva', 'violetti'}});
järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap2(umap1);

Elementtipari

Seuraava koodi näyttää, miten parielementti luodaan ja sitä käytetään:

pari<hiiltyä, const hiiltyä*>PR= {'d', 'olla'};
kustannus<<PR.ensimmäinen << '' n'';
kustannus<<PR.toinen << '' n'';

Lähtö on:

d
olla

ensimmäinen ja toinen ovat varattuja sanoja kahdelle parin kohteelle. Parin arvoja voidaan edelleen muuttaa käyttämällä ensimmäistä ja toista.

Järjestämättömän kartan aiheessa on pari, arvo_tyyppi.

unordered_map Element Access

kartoitettu_tyyppi ja operaattori [] (avaintyyppi && k)
Palauttaa vastaavan avaimen arvon. Esimerkki:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;

umap['banaani'] = 'keltainen';
umap['rypäle'] = 'vihreä';
umap['kuva'] = 'violetti';

const hiiltyä *oikein=umap['rypäle'];

kustannus<<oikein<<'' n'';

Tulos on: vihreä. Arvot voidaan määrittää samalla tavalla - katso yllä.

unordered_map Kapasiteetti

size_type size () const noexcept
Palauttaa parin määrän kartalla.

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;

umap['banaani'] = 'keltainen';
umap['rypäle'] = 'vihreä';
umap['kuva'] = 'violetti';

kustannus<<umap.koko() <<'' n'';

Lähtö on 3.

bool empty () const noexcept

Palauttaa arvon 1 tosi, jos kartalla ei ole paria, ja 0, jos epätosi, jos sillä on pareja. Esimerkki:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;
kustannus<<umap.tyhjä() <<'' n'';

Lähtö on 1.

Palauttavat iteraattorit ja järjestämättömän kartan luokka

Iteraattori on kuin osoitin, mutta sillä on enemmän toimintoja kuin osoitin.

begin () noexcept

Palauttaa iteraattorin, joka osoittaa karttaobjektin ensimmäiseen pariin, kuten seuraavassa koodisegmentissä:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;

umap['banaani'] = 'keltainen';umap['rypäle'] = 'vihreä';umap['kuva'] = 'violetti';

järjestämätön_kartta<const hiiltyä*, const hiiltyä*> ::iteraattoriiter=umap.alkaa();
pari<const hiiltyä*, const hiiltyä*>PR= *iter;
kustannus<<PR.ensimmäinen << ',' <<PR.toinen << '' n'';

Tulos on: viikuna, violetti. Kartta on tilattu.

begin () const noexcept;

Palauttaa iteraattorin, joka osoittaa karttaobjektikokoelman ensimmäiseen elementtiin. Kun objektirakennetta edeltää const, lauseke begin () const suoritetaan begin () sijasta. Tässä tilanteessa objektin elementtejä ei voi muokata. Sitä käytetään esimerkiksi seuraavassa koodissa.

constjärjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap({{'banaani', 'keltainen'},
{'rypäle', 'vihreä'}, {'kuva', 'violetti'}});

järjestämätön_kartta<const hiiltyä*, const hiiltyä*> ::const_iteratoriter=umap.alkaa();
pari<const hiiltyä*, const hiiltyä*>PR= *iter;
kustannus<<PR.ensimmäinen << ',' <<PR.toinen << '' n'';

Tulos on: viikuna, violetti. Kartta on tilattu. Huomaa, että const_iterator on tällä kertaa käytetty vain iteraattorin sijasta palautetun iteraattorin vastaanottamiseen.

end () noexcept

Palauttaa iteraattorin, joka osoittaa suoraan karttakohteen viimeisen elementin ulkopuolelle.

end () const noexcept

Palauttaa iteraattorin, joka osoittaa suoraan karttakohteen viimeisen elementin ulkopuolelle. Kun karttaobjektirakennetta edeltää const, lauseke end () const suoritetaan end (): n sijasta.

unordered_map -toiminnot

iteraattorihaku (const key_type & k)

Etsii paria annetusta avaimesta kartalla. Jos se löytyy, se palauttaa iteraattorin. Jos sitä ei löydy, se palauttaa iteraattorin, joka osoittaa kartan loppuun, joka ei ole pari. Seuraava koodi näyttää tämän jäsentoiminnon käytön:

järjestämätön_kartta<hiiltyä,hiiltyä>umap;

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

järjestämätön_kartta<hiiltyä,hiiltyä> ::iteraattoriiter=umap.löytö('c');
jos (umap.löytö('c') ! =umap.loppuun())
{
pari<hiiltyä,hiiltyä>PR= *iter;
kustannus<<PR.ensimmäinen << ',' <<PR.toinen << '' n'';
}

Tulos on: c, d

const_iterator löytää (const key_type & k) const;

Tätä funktion versiota kutsutaan, jos järjestämättömän kartan luominen alkaa const, jolloin kaikki kartan elementit ovat vain luku -tilassa.

unordered_map Modifiers

parin lisäys (arvon_tyyppi && obj)
Järjestämätön kartta tarkoittaa, että parit eivät ole missään järjestyksessä. Joten ohjelma lisää parin mihin tahansa sopivaan paikkaan. Funktio palaa, pari. Jos lisäys onnistui, bool on 1 tosi, muussa tapauksessa 0 on epätosi. Jos lisäys onnistuu, iteraattori osoittaa juuri lisättyyn elementtiin. Seuraava koodi kuvaa käyttöä:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;

umap['banaani'] = 'keltainen';
umap['rypäle'] = 'vihreä';
umap['kuva'] = 'violetti';

umap.lisää({{'kirsikka', 'netto'}, {'mansikka', 'netto'}});

kustannus<<umap.koko() << '' n'';

Tulos on: 5. Useita pareja voidaan lisätä.

kokotyypin poisto (const key_type & k)

Tämä toiminto poistaa parin järjestämättömästä kartasta. Seuraava koodisegmentti havainnollistaa:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap;

umap['banaani'] = 'keltainen';
umap['rypäle'] = 'vihreä';
umap['kuva'] = 'violetti';

intyhdellä=umap.poistaa('rypäle');

kustannus<<umap.koko() << '' n'';

Lähtö on 2.
mitätön vaihto (järjestämätön_kartta &)
Kaksi järjestämätöntä karttaa voidaan vaihtaa, kuten tässä koodisegmentissä on esitetty:

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap1= {{'banaani', 'keltainen'},
{'rypäle', 'vihreä'}, {'kuva', 'violetti'}, {'mansikka', 'netto'}};

järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap2= {{'kirsikka', 'netto'}, {'lime', 'vihreä'}};

umap1.vaihtaa(umap2);

järjestämätön_kartta<const hiiltyä*, const hiiltyä*> ::iteraattoriiter1=umap1.alkaa();
pari<const hiiltyä*, const hiiltyä*>pr1= *iter1;
järjestämätön_kartta<const hiiltyä*, const hiiltyä*> ::iteraattoriiter2=umap2.alkaa();
pari<const hiiltyä*, const hiiltyä*>pr2= *iter2;

kustannus<< 'Ensimmäinen avain ja umap1: n koko:'<<pr1.ensimmäinen <<','<<umap1.koko() << '' n'';
kustannus<< 'Ensimmäinen avain ja umap2: n koko'<<pr2.ensimmäinen <<','<<umap2.koko() << '' n'';
järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap1= {{'banaani', 'keltainen'},
{'rypäle', 'vihreä'}, {'kuva', 'violetti'}, {'mansikka', 'netto'}};
järjestämätön_kartta<const hiiltyä*, const hiiltyä*>umap2= {{'kirsikka', 'netto'}, {'lime', 'vihreä'}};

umap1.vaihtaa(umap2);

järjestämätön_kartta<const hiiltyä*, const hiiltyä*> ::iteraattoriiter1=umap1.alkaa();
pari<const hiiltyä*, const hiiltyä*>pr1= *iter1;
järjestämätön_kartta<const hiiltyä*, const hiiltyä*> ::iteraattoriiter2=umap2.alkaa();
pari<const hiiltyä*, const hiiltyä*>pr2= *iter2;

kustannus<< 'Ensimmäinen avain ja umap1: n koko:'<<pr1.ensimmäinen <<','<<umap1.koko() << '' n'';
kustannus<< 'Ensimmäinen avain ja umap2: n koko'<<pr2.ensimmäinen <<','<<umap2.koko() << '' n'';

Lähtö on:

Ensimmäinen avain ja umap1 -koko: kalkki, 2

Ensimmäinen avain ja umap2 mansikan koko, 4

Kartta on tilattu. Huomaa, että kartan pituutta lisätään tarvittaessa. Tietotyyppien on oltava samat.

Luokka ja sen välittävät objektit

Arvo on tietotyypille, kuten luotu objekti luokalle. Järjestämätön karttarakenne voi myös hyväksyä luokan tietotyypiksi. Seuraava ohjelma havainnollistaa tätä:

#sisältää
#sisältää
käyttämällä nimiavaruuden std;

luokka TheCla
{
julkinen:
intyhdellä;
staattinen hiiltyäch;

mitätöntoiminto(hiiltyäei, const hiiltyä *s)
{
kustannus<< 'Siellä on ' <<yhdellä<< 'arvokkaita kirjoja' <<ei<<s<< ' kaupassa.' << '' n'';
}
staattinen mitätönhauskaa(hiiltyäch)
{
jos (ch== '')
kustannus<< '' Virallinen staattinen jäsentoiminto '' << '' n'';
}
};

inttärkein()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

järjestämätön_kartta<const hiiltyä*,TheCla>umap;
umap= {{'banaani',obj1}, {'rypäle',obj2}, {'kuva',obj3}, {'mansikka',obj4}, {'lime',obj5}};

kustannus<<umap.koko() << '' n'';

palata 0;
}

Tulos on: 5.

Luokan määritelmässä on kaksi julkista datajäsentä ja kaksi julkista jäsentoimintoa. Main () -funktiossa luokan eri objektit näytetään. Järjestämätön kartta näytetään sitten, ja jokainen pari koostuu hedelmän nimestä ja luokan esineestä. Kartan koko näytetään. Ohjelma kääntyy ilman varoitus- tai virheilmoitusta.

Kartan soveltaminen

Matriisi liittää indeksin arvoon. Avain/arvo -pareja on olemassa monissa elämäntilanteissa, jotka voidaan ohjelmoida. Hedelmä/väri -avain/arvo -pari on vain yksi esimerkki. Toinen esimerkki on ihmisten nimet ja heidän ikänsä. Tässä tapauksessa pari on tyyppiä, pari. Se voi olla myös pari. Jälkimmäisessä tapauksessa käytetään esikäsittelydirektiiviä. Avain/arvo -pari voi edelleen olla avioparien nimet. Maissa, joissa on moniavioisuutta, yhdellä miehellä on eri vaimot.

Kartan muodostaminen

Kartta ei ole kaksiulotteinen matriisi, jossa on kaksi saraketta. Kartta toimii hash -funktion kanssa. Hajautusfunktio koodaa avaimen matriisin kokonaislukuksi. Tämä taulukko pitää arvot. Joten todellisuudessa on yksi taulukko, jossa on arvot, ja avaimet yhdistetään taulukon indekseihin, ja näin saadaan aikaan avainten ja arvojen väliset vastaavuudet. Hajautus on laaja aihe, eikä sitä käsitellä tässä artikkelissa.

Johtopäätös

Kartta, joka tunnetaan myös nimellä assosiatiivinen taulukko, on luettelo elementeistä, joissa jokainen elementti on avain/arvo -pari. Jokainen avain vastaa siis arvoa. C ++: ssa kartta toteutetaan tietorakenteena jäsenfunktioilla ja operaattoreilla. Tilattu kartta on kartta, jossa elementtiparit on järjestetty avaimilla. Järjestämätön kartta on sellainen, jossa ei ole tilausta.

Teknisesti hajautus koostuu parielementeistä. Itse asiassa pari on kokonainen tietorakenne jäsenfunktioineen ja operaattoreineen. Parin kaksi malliparametria ovat samat kaksi malliparametria järjestämättömälle kartalle.

Kartan Initializer_list on matriittiliteraali literaaleja. Jokainen sisäinen literaali koostuu kahdesta objektista, avain/arvo -parista.

Järjestämättömän_kartan jäsentoiminnot ja operaattorit voidaan luokitella seuraaviin otsikoihin: järjestämättömän_kartan rakentaminen/kopiointi, järjestämättömän_kartan kapasiteetti, järjestämättömän_kartan iteraattori, järjestämättömän kartan toiminnot ja järjestämättömän_kartan muokkaajat.

Järjestämätöntä karttaa käytetään, kun avain on yhdistettävä arvoon.

Chrys