C ++

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

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

Trieda a predmety

Trieda je skupina premenných a funkcií, ktoré spolupracujú, pričom premenným nie sú priradené hodnoty. Keď sú premenným priradené hodnoty, trieda sa stane objektom. Rôzne hodnoty dané tej istej triede majú za následok rôzne objekty; to znamená, že rôzne objekty sú rovnakej triedy s rôznymi hodnotami. Vytvorenie objektu z triedy sa považuje za vytvorenie jeho inštancie.

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

Na vytvorenie inštancie objektu z triedy je potrebná funkcia patriaca do triedy. V jazyku C ++ má táto funkcia rovnaký názov ako názov triedy. Objekty vytvorené (inštancované) z triedy majú programátor pomenované rôznymi názvami.

Vytvorenie objektu z triedy znamená konštrukciu objektu; znamená to aj inštanciu.

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

#include
#include
pomocou namespace std;

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

Preťaženie funkcie

Ak majú dva alebo viac rôznych podpisov funkcií rovnaký názov, je tento názov údajne preťažený. Keď sa volá jedna funkcia, počet a typ argumentov určuje, 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 umap;
umap ["banana"] = "žltá";
umap ["grape"] = "zelená";
umap ["fig"] = "fialová";

Deklarácia sa začína špecializáciou na šablóny s typmi pre páry kľúč a hodnota. Potom nasleduje programovo zvolené meno pre mapu; potom bodkočiarku. Druhý segment kódu ukazuje, ako priradiť hodnoty k ich klávesom.
Konštrukcia podľa Initializer_list
Môžete to urobiť nasledovne:

unordered_map umap ("" banana "," yellow ",
"grape", "green", "fig", "purple");

Konštrukcia priradením Initializer_list
Príklad:

unordered_map umap = "banán", "žltá",
"grape", "green", "fig", "purple";

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

unordered_map umap1 ("" banana "," zlta ",
"grape", "green", "fig", "purple");
unordered_map umap2 (umap1);

Pár Element

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

pár pr = 'd', "more";
cout << pr.first << '\n';
cout << pr.second << '\n';

Výstup je:

d
more

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.

V téme neusporiadanej mapy sa nazýva pár value_type.

unordered_map Element Access

mapped_type & operator [] (key_type && k)
Vráti hodnotu pre zodpovedajúci kľúč. Príklad:

unordered_map umap;
umap ["banana"] = "žltá";
umap ["grape"] = "zelená";
umap ["fig"] = "fialová";
const char * ret = umap ["hrozno"];
cout << ret <<'\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 umap;
umap ["banana"] = "žltá";
umap ["grape"] = "zelená";
umap ["fig"] = "fialová";
cout << umap.size() <<'\n';

Výstup je 3.

bool empty () const noexcept

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

unordered_map umap;
cout << umap.empty() <<'\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 mapového objektu, ako v nasledujúcom segmente kódu:

unordered_map umap;
umap ["banana"] = "žltá"; umap ["grape"] = "zelená"; umap ["fig"] = "fialová";
unordered_map:: iterátor iter = umap.začať();
pár pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

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

begin () const noexcept;

Vráti iterátor, ktorý ukazuje na prvý prvok kolekcie mapových objektov. Ak konštrukcii objektu predchádza const, namiesto výrazu „begin ()“ sa vykoná výraz „begin () const“. Za týchto podmienok nemožno upravovať prvky v objekte. Používa sa napríklad v nasledujúcom kóde.

const unordered_map umap ("" banana "," yellow ",
"grape", "green", "fig", "purple");
unordered_map:: const_iterator iter = umap.začať();
pár pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Výstup je: figový, fialový. Mapa nie je zoradená. Všimnite si, že const_iterator bol tentokrát použitý namiesto iba iterátora na príjem vráteného iterátora.

end () noexcept

Vráti iterátor, ktorý smeruje bezprostredne za posledný prvok mapového objektu.

end () const noexcept

Vráti iterátor, ktorý smeruje bezprostredne za posledný prvok mapového objektu. Keď konštrukcii mapového objektu predchádza const, namiesto „end ()“ sa vykoná výraz „end () const“.

unordered_map Operácie

find iterator (const key_type & k)

Vyhľadá dvojicu zadaných kľúčov na mape. 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 sa používa táto členská funkcia:

unordered_map umap;
umap ['a'] = 'b'; umap ['c'] = 'd'; umap ['e'] = 'f';
unordered_map:: iterátor iter = umap.find ('c');
ak (umap.nájsť ('c') != umap.koniec())

pár pr = * iter;
cout << pr.first << ", " << pr.second << '\n';

Výstup je: c, d

const_iterator find (const key_type & k) const;

Táto verzia funkcie sa nazýva, ak sa tvorba neusporiadanej mapy začína znakom const, čím sa všetky prvky mapy stanú iba na čítanie.

unordered_map Modifikátory

pár insert (hodnota_typu && obj)
Neusporiadaná mapa znamená, že páry nie sú v žiadnom poradí. Program teda vloží dvojicu na akékoľvek miesto, ktoré považuje za vhodné. Funkcia sa vráti, spárovať. Ak bolo vloženie úspešné, bool bude 1 pre true, inak by bol 0 pre false. Ak je vloženie úspešné, potom iterátor bude ukazovať na novo vložený prvok. Nasledujúci kód ilustruje použitie:

unordered_map umap;
umap ["banana"] = "žltá";
umap ["grape"] = "zelená";
umap ["fig"] = "fialová";
umap.vložka ("" čerešňa "," červená ", " jahoda "," červená ");
cout << umap.size() << '\n';

Výstup je: 5. Môže byť vložených viac ako jeden pár.

size_type erase (const key_type & k)

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

unordered_map umap;
umap ["banana"] = "žltá";
umap ["grape"] = "zelená";
umap ["fig"] = "fialová";
int num = umap.vymazať („hrozno“);
cout << umap.size() << '\n';

Výstup je 2.
výmena neplatnosti (unordered_map &)
Je možné zameniť dve neusporiadané mapy, ako je to znázornené v tomto segmente kódu:

unordered_map umap1 = "banán", "žltá",
"hrozno", "zelená", "figa", "fialová", "jahoda", "červená";
unordered_map umap2 = "čerešňa", "červená", "limetková", "zelená";
umap1.swap (umap2);
unordered_map:: iterátor iter1 = umap1.začať();
pár pr1 = * iter1;
unordered_map:: iterátor iter2 = umap2.začať();
pár 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';
unordered_map umap1 = "banán", "žltá",
"hrozno", "zelená", "figa", "fialová", "jahoda", "červená";
unordered_map umap2 = "čerešňa", "červená", "limetková", "zelená";
umap1.swap (umap2);
unordered_map:: iterátor iter1 = umap1.začať();
pár pr1 = * iter1;
unordered_map:: iterátor iter2 = umap2.začať();
pár 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';

Výstup je:

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

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

Mapa nie je zoradená. Upozorňujeme, že dĺžka mapy sa v prípade potreby zväčší. Dátové typy musia byť rovnaké.

Trieda a jej instantizované objekty

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

#include
#include
pomocou namespace std;
trieda TheCla

verejné:
int num;
statický znak ch;
void func (char cha, const char * str)

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

static void fun (char ch)

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

;
int main ()

TheCla obj1; TheCla obj2; TheCla obj3; TheCla obj4; TheCla obj5;
unordered_map umap;
umap = "banana", obj1, "grape", obj2, "fig", obj3, "jahoda", obj4, "limetka", obj5;
cout << umap.size() << '\n';
návrat 0;

Výstup je: 5.

Definícia triedy má dva verejné verejné členy a dve verejné členské funkcie. Vo funkcii main () sú inštancované rôzne objekty pre triedu. Potom sa vytvorí inštancia neusporiadanej mapy, kde každý pár pozostáva z názvu ovocia a predmetu z triedy. Zobrazí sa veľkosť mapy. Program sa kompiluje bez varovania alebo chybovej správy.

Aplikácia mapy

Pole priraďuje index k hodnote. Páry kľúč / hodnota existujú v mnohých životných situáciách, ktoré je možné programovať. Pár kľúč - hodnota ovocie / farba je len jedným príkladom. Ďalším príkladom je meno ľudí a ich vek. V takom prípade bude dvojica typu, páru. Môže to byť aj pár. V druhom prípade sa použije smernica o predbežnom spracovaní. Párom kľúč / hodnota môžu byť stále mená manželských párov. V krajinách, kde existuje polygamia, budú pre jedného muža odlišné manželky.

Tvorba mapy

Mapa nie je dvojrozmerné pole s dvoma stĺpcami. Mapa funguje s funkciou hash. Kľúč je kódovaný hašovacou funkciou do celého čísla poľa. Je to toto pole, ktoré uchováva hodnoty. Takže v skutočnosti existuje jedno pole s hodnotami a kľúče sú mapované na indexy poľa, takže sa vytvára korešpondencia medzi kľúčmi a hodnotami. Hašovanie je rozsiahla téma, ktorej sa tento článok nevenuje.

Záver

Mapa, známa tiež ako asociatívne pole, je zoznam prvkov, kde každý prvok predstavuje pár kľúč - hodnota. Každý kľúč teda zodpovedá hodnote. V C ++ je mapa implementovaná ako dátová štruktúra s členskými funkciami a operátormi. Usporiadaná mapa je mapa, kde boli páry prvkov zoradené pomocou klávesov. Neusporiadaná mapa je taká, na ktorej nie je možné objednávať.

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

Initializer_list pre mapu je pole literálu literálov. Každý interný literál pozostáva z dvoch objektov, páru kľúč / hodnota.

Členské funkcie a operátory pre unordered_map je možné kategorizovať do nasledujúcich nadpisov: unordered_map construction / copy constructing, unordered_map Capacity, unordered_map iterator, unordered_map Operations a unordered_map Modifikátory.

Neusporiadaná mapa sa používa, keď sa má kľúč namapovať na hodnotu.

Chrys

Ako používať Xdotool na stimuláciu kliknutí a stlačenia myši v systéme Linux
Xdotool je bezplatný a otvorený nástroj príkazového riadku na simuláciu kliknutí a stlačenia klávesov myši. Tento článok sa bude týkať stručného sprie...
Top 5 ergonomických produktov pre počítačové myši pre Linux
Spôsobuje dlhodobé používanie počítača bolesť zápästia alebo prstov? Trpíte stuhnutými kĺbmi a neustále si musíte podávať ruky? Cítite pálivú bolesť z...
Ako zmeniť nastavenie myši a touchpadu pomocou systému Xinput v systéme Linux
Väčšina distribúcií systému Linux sa štandardne dodáva s knižnicou „libinput“ na spracovanie vstupných udalostí v systéme. Dokáže spracovať vstupné ud...