Ako používať neusporiadanú mapu C ++

How Use C Unordered Map



Mapa, známa tiež ako asociatívne pole, je zoznam prvkov, kde každý prvok je dvojicou kľúč/hodnota. Každý kľúč teda zodpovedá nejakej hodnote. Rôzne kľúče môžu mať pre bežnú prácu rovnakú hodnotu. Kľúčmi môže byť napríklad zoznam ovocia a zodpovedajúce hodnoty, farby plodov. V C ++ je mapa implementovaná ako dátová štruktúra s členskými funkciami a operátormi. Usporiadaná mapa je mapa, kde sú páry prvkov zoradené podľa kľúčov. Neusporiadaná mapa je mapa, kde nie je poriadok. Tento článok vysvetľuje, ako používať neusporiadanú mapu C ++, napísanú ako unordered_map. Na pochopenie tohto článku potrebujete znalosti o ukazovateľoch C ++. unordered_map je súčasťou štandardnej knižnice C ++.

Trieda a objekty

Trieda je množina premenných a funkcií, ktoré spolupracujú a kde premenným nie sú priradené žiadne hodnoty. Keď sú premenným priradené hodnoty, trieda sa stane objektom. Rôzne hodnoty dané tej istej triede vedú k rôznym predmetom; to znamená, že rôzne objekty sú rovnakou triedou s rôznymi hodnotami. Vytvorenie objektu z triedy je údajne inštanciou objektu.







Názov, unordered_map, je trieda. Objekt vytvorený z triedy unordered_map má názov zvolený programátorom.



Funkcia, ktorá patrí do triedy, je potrebná na vytvorenie inštancie objektu z triedy. V C ++ má táto funkcia rovnaký názov ako názov triedy. Objekty vytvorené (inštancované) z triedy majú programátor rôzne názvy.



Vytvorenie objektu z triedy znamená zostrojenie objektu; to tiež znamená inštancovanie.





Program C ++, ktorý používa triedu unordered_map, začína na nasledujúcich riadkoch v hornej časti súboru:

#zahrnúť
#zahrnúť
pomocou priestoru názvov std;

Prvý riadok je pre vstup/výstup. Druhý riadok má umožniť programu využívať všetky funkcie triedy unordered_map. Tretí riadok umožňuje programu používať názvy v štandardnom priestore názvov.



Preťaženie funkcie

Keď majú dva alebo viac rôznych podpisov funkcií rovnaký názov, tento názov je údajne preťažený. Pri volaní jednej funkcie určuje počet a typ argumentov, ktorá funkcia sa skutočne vykoná.

Konštrukcia/kopírovanie

Jednoduchá konštrukcia

Neusporiadanú mapu je možné zostrojiť a priradiť jej hodnoty nasledovne:

unordered_map<konšt char*, konšt char*>umap;

umap['banán'] = 'žltá';
umap[„hrozno“] = 'zelená';
umap['fig'] = 'Fialová';

Deklarácia začína špecializáciou šablóny s typmi pre páry kľúčov a hodnôt. Nasleduje programátorom zvolený názov mapy; potom bodkočiarka. Druhý segment kódu ukazuje, ako je možné priradiť hodnoty ich kľúčom.
Konštrukcia podľa zoznamu inicializátorov
To sa dá urobiť nasledovne:

unordered_map<konšt char*, konšt char*>umap({{'banán', 'žltá'},
{„hrozno“, 'zelená'}, {'fig', 'Fialová'}});

Konštrukcia priradením zoznamu inicializátorov
Príklad:

unordered_map<konšt char*, konšt char*>umap= {{'banán', 'žltá'},
{„hrozno“, 'zelená'}, {'fig', 'Fialová'}};

Konštrukcia skopírovaním ďalšej unordered_map
Príklad:

unordered_map<konšt char*, konšt char*>umap1({{'banán', 'žltá'},
{„hrozno“, 'zelená'}, {'fig', 'Fialová'}});
unordered_map<konšt char*, konšt char*>umap2(umap1);

Dvojica Element

Nasledujúci kód ukazuje, ako vytvoriť a získať prístup k párovému prvku:

pár<char, konšt char*>pr= {'d', 'byť'};
náklady<<pr.najprv << ' n';
náklady<<pr.druhý << ' n';

Výstupom je:

d
byť

prvé a druhé sú vyhradené slová pre dve položky v páre. Hodnoty v páre je možné stále meniť pomocou prvého a druhého.

Dvojica sa v téme neusporiadanej mapy nazýva „value_type“.

unordered_map Prístup k elementu

mapovaný_typ a operátor [] (typ_kľúča && k)
Vráti hodnotu pre príslušný kľúč. Príklad:

unordered_map<konšt char*, konšt char*>umap;

umap['banán'] = 'žltá';
umap[„hrozno“] = 'zelená';
umap['fig'] = 'Fialová';

konšt char *správny=umap[„hrozno“];

náklady<<správny<<' n';

Výstup je: zelený. Hodnoty je možné priradiť rovnakým spôsobom - pozri vyššie.

unordered_map Kapacita

size_type size () const noexcept
Vráti počet párov na mape.

unordered_map<konšt char*, konšt char*>umap;

umap['banán'] = 'žltá';
umap[„hrozno“] = 'zelená';
umap['fig'] = 'Fialová';

náklady<<umap.veľkosť() <<' n';

Výstup je 3.

bool empty () const noexcept

Vráti 1 pre true, ak mapa žiadny pár nemá, a 0 pre false, ak má páry. Príklad:

unordered_map<konšt char*, konšt char*>umap;
náklady<<umap.prázdny() <<' n';

Výstup je 1.

Vracajúce sa iterátory a trieda neusporiadaných máp

Iterátor je ako ukazovateľ, ale má viac funkcií ako ukazovateľ.

begin () noexcept

Vráti iterátor, ktorý ukazuje na prvý pár objektu mapy, ako v nasledujúcom segmente kódu:

unordered_map<konšt char*, konšt char*>umap;

umap['banán'] = 'žltá';umap[„hrozno“] = 'zelená';umap['fig'] = 'Fialová';

unordered_map<konšt char*, konšt char*> ::iterátoriter=umap.začať();
pár<konšt char*, konšt char*>pr= *iter;
náklady<<pr.najprv << ',' <<pr.druhý << ' n';

Výstup je: figová, fialová. Mapa nie je objednaná.

begin () const noexcept;

Vráti iterátor, ktorý ukazuje na prvý prvok kolekcie objektov mapy. Keď konštrukcii objektu predchádza príkaz const, namiesto príkazu begin () sa vykoná výraz begin () const. Za tejto podmienky nie je možné upravovať prvky v objekte. Používa sa napríklad v nasledujúcom kóde.

konštunordered_map<konšt char*, konšt char*>umap({{'banán', 'žltá'},
{„hrozno“, 'zelená'}, {'fig', 'Fialová'}});

unordered_map<konšt char*, konšt char*> ::const_iteratoriter=umap.začať();
pár<konšt char*, konšt char*>pr= *iter;
náklady<<pr.najprv << ',' <<pr.druhý << ' n';

Výstup je: figová, fialová. Mapa nie je objednaná. Všimnite si toho, že tentoraz bol na prijatie vráteného iterátora použitý const_iterator, nie iba iterátor.

end () noexcept

Vráti iterátor, ktorý ukazuje bezprostredne za posledný prvok objektu mapy.

end () const noexcept

Vráti iterátor, ktorý ukazuje bezprostredne za posledný prvok objektu mapy. Keď konštrukcii objektu mapy predchádza const, namiesto end () sa vykoná výraz end () const.

unordered_map Operations

nájsť iterátor (konšt. kľúčový_typ & k)

Na mape vyhľadá dvojicu daného kľúča. Ak sa nájde, vráti iterátor. Ak sa nenájde, vráti iterátor, ktorý ukazuje na koniec mapy, čo nie je pár. Nasledujúci kód ukazuje, ako používať túto členskú funkciu:

unordered_map<char,char>umap;

umap[„do“] = 'b';umap['c'] = 'd';umap[„A“] = 'f';

unordered_map<char,char> ::iterátoriter=umap.Nájsť('c');
keby (umap.Nájsť('c') ! =umap.koniec())
{
pár<char,char>pr= *iter;
náklady<<pr.najprv << ',' <<pr.druhý << ' n';
}

Výstup je: c, d

const_iterator find (const key_type & k) const;

Táto verzia funkcie sa nazýva, ak vytváranie neusporiadanej mapy začína konštantou, ktorá robí všetky prvky mapy iba na čítanie.

unordered_map Modifiers

vloženie páru (value_type && obj)
Neusporiadaná mapa znamená, že páry nie sú v žiadnom poradí. Program teda vloží pár na ľubovoľné miesto, ktoré mu vyhovuje. Funkcia sa vráti, spárujte. Ak bolo vloženie úspešné, bool bude 1 pre true, inak by bol 0 pre false. Ak je vloženie úspešné, iterátor bude ukazovať na novo vložený prvok. Nasledujúci kód ilustruje použitie:

unordered_map<konšt char*, konšt char*>umap;

umap['banán'] = 'žltá';
umap[„hrozno“] = 'zelená';
umap['fig'] = 'Fialová';

umap.vložiť({{'čerešňa', 'net'}, {„jahoda“, 'net'}});

náklady<<umap.veľkosť() << ' n';

Výstup je: 5. Je možné vložiť viac ako jeden pár.

vymazať_typ veľkosti (konšt. kľúč_typu & k)

Táto funkcia vymaže pár z mapy unordered_map. Nasledujúci segment kódu ukazuje:

unordered_map<konšt char*, konšt char*>umap;

umap['banán'] = 'žltá';
umap[„hrozno“] = 'zelená';
umap['fig'] = 'Fialová';

intna jeden=umap.vymazať(„hrozno“);

náklady<<umap.veľkosť() << ' n';

Výstup je 2.
výmena neplatností (unordered_map &)
Dve neusporiadané mapy je možné vymeniť, ako je to znázornené v tomto segmente kódu:

unordered_map<konšt char*, konšt char*>umap1= {{'banán', 'žltá'},
{„hrozno“, 'zelená'}, {'fig', 'Fialová'}, {„jahoda“, 'net'}};

unordered_map<konšt char*, konšt char*>umap2= {{'čerešňa', 'net'}, {'vápno', 'zelená'}};

umap1.vymeniť(umap2);

unordered_map<konšt char*, konšt char*> ::iterátoriter1=umap1.začať();
pár<konšt char*, konšt char*>pr1= *iter1;
unordered_map<konšt char*, konšt char*> ::iterátoriter2=umap2.začať();
pár<konšt char*, konšt char*>pr2= *iter2;

náklady<< „Prvý kľúč a veľkosť umap1:“<<pr1.najprv <<','<<umap1.veľkosť() << ' n';
náklady<< „Prvý kľúč a veľkosť umap2“<<pr2.najprv <<','<<umap2.veľkosť() << ' n';
unordered_map<konšt char*, konšt char*>umap1= {{'banán', 'žltá'},
{„hrozno“, 'zelená'}, {'fig', 'Fialová'}, {„jahoda“, 'net'}};
unordered_map<konšt char*, konšt char*>umap2= {{'čerešňa', 'net'}, {'vápno', 'zelená'}};

umap1.vymeniť(umap2);

unordered_map<konšt char*, konšt char*> ::iterátoriter1=umap1.začať();
pár<konšt char*, konšt char*>pr1= *iter1;
unordered_map<konšt char*, konšt char*> ::iterátoriter2=umap2.začať();
pár<konšt char*, konšt char*>pr2= *iter2;

náklady<< „Prvý kľúč a veľkosť umap1:“<<pr1.najprv <<','<<umap1.veľkosť() << ' n';
náklady<< „Prvý kľúč a veľkosť umap2“<<pr2.najprv <<','<<umap2.veľkosť() << ' n';

Výstupom je:

Prvý kľúč a veľkosť umap1: vápno, 2

Prvý kľúč a veľkosť jahody umap2, 4

Mapa nie je objednaná. V prípade potreby sa dĺžka mapy zvýši. Dátové typy musia byť rovnaké.

Trieda a jej inštancionálne objekty

Hodnota je pre dátový typ, pretože inštancovaný objekt je pre triedu. Neusporiadaná konštrukcia mapy môže tiež akceptovať triedu ako dátový typ. Nasledujúci program to ilustruje:

#zahrnúť
#zahrnúť
pomocou priestoru názvov std;

trieda TheCla
{
verejná:
intna jeden;
statický charch;

prázdnyfunkciu(charč, konšt char *p)
{
náklady<< 'Existujú ' <<na jeden<< „knihy, ktoré stoja za to“ <<č<<p<< ' v obchode.' << ' n';
}
statický prázdnyzábava(charch)
{
keby (ch== „do“)
náklady<< „Oficiálna statická členská funkcia“ << ' n';
}
};

intHlavná()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

unordered_map<konšt char*,TheCla>umap;
umap= {{'banán',obj1}, {„hrozno“,obj2}, {'fig',obj3}, {„jahoda“,obj4}, {'vápno',obj5}};

náklady<<umap.veľkosť() << ' n';

vrátiť sa 0;
}

Výstup je: 5.

Definícia triedy má dvoch verejných dátových členov a dve verejné členské funkcie. Vo funkcii main () sa inštancujú rôzne objekty pre triedu. Potom sa vytvorí inštancia neusporiadanej mapy, kde každá dvojica pozostáva z názvu ovocia a predmetu z triedy. Zobrazí sa veľkosť mapy. Program sa kompiluje bez varovania alebo chybového hlásenia.

Aplikácia mapy

Pole asociuje index s hodnotou. Páry kľúč/hodnota existujú v mnohých životných situáciách, ktoré je možné naprogramovať. Pár kľúč/hodnota ovocia/farby je len jedným príkladom. Ďalším príkladom je meno ľudí a ich vek. V tomto prípade bude dvojica typu, pár. Môže byť aj párový. V druhom prípade sa použije smernica o predbežnom spracovaní. Dvojicou kľúč/hodnota môžu byť stále mená manželských párov. V krajinách, kde je polygamia, budú pre jedného muža rôzne manželky.

Vytvorenie mapy

Mapa nie je dvojrozmerné pole s dvoma stĺpcami. Mapa funguje s hašovacou funkciou. Kľúč je kódovaný funkciou hash do celého čísla poľa. Toto pole uchováva hodnoty. V skutočnosti teda existuje jedno pole s hodnotami a kľúče sú mapované na indexy poľa, a tak sa vytvárajú korešpondencie medzi kľúčmi a hodnotami. Hašovanie je rozsiahla téma a tento článok sa ním nezaoberá.

Záver

Mapa, známa tiež ako asociatívne pole, je zoznam prvkov, kde každý prvok je dvojicou kľúč/hodnota. Každý kľúč teda zodpovedá nejakej hodnote. V C ++ je mapa implementovaná ako dátová štruktúra s členskými funkciami a operátormi. Usporiadaná mapa je mapa, kde sú páry prvkov zoradené podľa kľúčov. Neusporiadaná mapa je mapa, kde sa nedá objednať.

Technicky sa hash skladá z párových prvkov. V skutočnosti je tento pár celá dátová štruktúra s členskými funkciami a operátormi. Dva parametre šablóny pre pár sú rovnaké dva parametre šablóny pre unordered_map.

Zoznam_inicializátorov pre mapu je pole doslovné. Každý interný literál pozostáva z dvoch objektov, páru kľúč/hodnota.

Členské funkcie a operátory pre unordered_map môžu byť kategorizované pod nasledujúcimi nadpismi: unordered_map construction/copy constructing, unordered_map Capacity, unordered_map iterator, unordered_map Operations, and unordered_map Modifiers.

Neusporiadaná mapa sa používa vtedy, keď je potrebné kľúč mapovať na hodnotu.

Chrys