logo

unordered_map v C++ STL

unordered_map je pridružený kontajner, ktorý ukladá prvky tvorené kombináciou hodnoty kľúča a namapovanej hodnoty. Hodnota kľúča sa používa na jedinečnú identifikáciu prvku a namapovaná hodnota je obsah spojený s kľúčom. Kľúč aj hodnota môžu byť ľubovoľného typu preddefinovaného alebo definovaného používateľom. Zjednodušene povedané, an unordered_map je ako dátová štruktúra typu slovníka, ktorá v sebe ukladá prvky. Obsahuje po sebe nasledujúce dvojice (kľúč, hodnota), čo umožňuje rýchle vyhľadanie jednotlivého prvku na základe jeho jedinečného kľúča.

1 z 1000

Interne unordered_map je implementovaná pomocou Hash Table , kľúč poskytnutý na mapovanie je hašovaný do indexov hašovacej tabuľky, čo je dôvod, prečo výkon dátovej štruktúry veľa závisí od hašovacej funkcie, ale v priemere sú náklady na hľadať, vkladať a mazať z hašovacej tabuľky je O(1).



Poznámka: V najhoršom prípade sa jeho časová zložitosť môže pohybovať od O(1) po O(n), najmä pre veľké prvočísla. V tejto situácii je veľmi vhodné použiť namiesto toho mapu, aby ste sa vyhli chybe TLE (Prekročený časový limit).

Syntax:

unordered_map syntax s príkladom

unordered_map syntax



Nižšie je uvedený program C++ na demonštráciu neusporiadanej mapy:

C++






// C++ program to demonstrate> // functionality of unordered_map> #include> #include> using> namespace> std;> > // Driver code> int> main()> {> >// Declaring umap to be of> >// type key> >// will be of STRING type> >// and mapped VALUE will> >// be of int type> >unordered_mapint>umap; // vkladanie hodnôt pomocou operátora [] umap['techcodeview.com'] = 10; umap['Cvičenie'] = 20; umap['Prispejte'] = 30; // Prechádzanie neusporiadanej mapy pre (auto x : umap) cout<< x.first << ' ' << x.second << endl; }>

>

>

Výkon

Contribute 30 Practice 20 techcodeview.com 10>
unordered_map Výstup s príkladom

unordered_map výstup

Vysvetlenie: Špecifická vec, ktorú tento výstup ospravedlňuje, je, že hodnota výsledku unordered_map sa vytvára náhodným spôsobom kľúč k hodnote, zatiaľ čo mapa zobrazuje hodnotu a kľúč usporiadaným spôsobom.

unordered_map vs unordered_set

Unordered_map

Unordered_set

Unordered_map obsahuje prvky iba vo forme párov (kľúč-hodnota). Unordered_set nemusí nevyhnutne obsahovať prvky vo forme párov kľúč-hodnota, tieto sa používajú hlavne na zobrazenie prítomnosti/neprítomnosti množiny.
Operátor []' extrahovať zodpovedajúcu hodnotu kľúča, ktorý sa nachádza na mape. Hľadanie prvku sa vykonáva pomocou a Nájsť () funkcia. Takže nie je potrebný operátor[].

Poznámka: Zamyslime sa napríklad nad problémom počítania frekvencií jednotlivých slov. Nemôžeme použiť unordered_set (alebo set), pretože nemôžeme ukladať počty, zatiaľ čo môžeme použiť unordered_map.

unordered_map vs mapa

Unordered_map

Mapa

Kľúč unordered_map môže byť uložený v ľubovoľnom poradí. Mapa je usporiadaná postupnosť jedinečných kľúčov
Unordered_Map implementuje nevyváženú stromovú štruktúru, kvôli ktorej nie je možné udržiavať poriadok medzi prvkami Mapa implementuje vyváženú stromovú štruktúru, vďaka čomu je možné udržiavať poriadok medzi prvkami (konkrétnym prechodom cez strom)
Časová zložitosť operácií unordered_map je v priemere O(1). Časová zložitosť mapových operácií je O(log n)

Metódy na unordered_map

K dispozícii je veľa funkcií, ktoré fungujú na unordered_map. Najužitočnejšie z nich sú:

    operator = operator [] prázdna veľkosť pre začiatok a koniec kapacity iterátora. nájsť a spočítať na vyhľadanie. vložiť a vymazať na úpravu.

Nasledujúca tabuľka zobrazuje úplný zoznam metód unordered_map:

Metódy/Funkcie

Popis

v () Táto funkcia v C++ unordered_map vracia odkaz na hodnotu s prvkom ako kľúč k
začať() Vráti iterátor ukazujúci na prvý prvok v kontajneri v kontajneri unordered_map
koniec() Vráti iterátor ukazujúci na pozíciu za posledným prvkom v kontajneri v kontajneri unordered_map
vedro() Vráti číslo segmentu, kde sa na mape nachádza prvok s kľúčom k
bucket_count Bucket_count sa používa na počítanie celkového počtu. z vedier v unordered_map. Na prechod do tejto funkcie nie je potrebný žiadny parameter
bucket_size Vráti počet prvkov v každom segmente unordered_map
počítať () Spočítajte počet prvkov prítomných v unordered_map s daným kľúčom
rovnaký_rozsah Vráti hranice rozsahu, ktorý zahŕňa všetky prvky v kontajneri, s kľúčom, ktorý sa porovnáva rovným k
Nájsť() Vráti iterátor prvku
prázdne () Skontroluje, či je kontajner prázdny v kontajneri unordered_map
vymazať() Vymažte prvky v kontajneri v kontajneri unordered_map

Knižnica C++11 tiež poskytuje funkcie na zobrazenie počtu interne používaných segmentov, veľkosti segmentov a tiež použitej hašovacej funkcie a rôznych hašovacích politík, ale v reálnych aplikáciách sú menej užitočné. Pomocou Iterátora môžeme iterovať cez všetky prvky unordered_map.

C++




// C++ program to demonstrate> // Initialization, indexing,> // and iteration> #include> #include> using> namespace> std;> > // Driver code> int> main()> {> >// Declaring umap to be of> >// type key> >// will be of string type and> >// mapped value will be of double type> >unordered_mapdouble>umap = { //vloženie prvku priamo do mapy {'Jeden', 1}, {'Dva', 2}, {'Tri', 3} }; // vkladanie hodnôt pomocou operátora [] umap['PI'] = 3.14; umap['root2'] = 1,414; umap['root3'] = 1,732; umap['log10'] = 2,302; umap['loge'] = 1,0; // vloženie hodnoty pomocou funkcie vloženia umap.insert(make_pair('e', 2.718)); kľúč reťazca = 'PI'; // Ak sa kľúč nenájde v iterátore mapy // do konca sa vráti if (umap.find(key) == umap.end()) cout<< key << ' not found '; // If key found then iterator to that // key is returned else cout << 'Found ' << key << ' '; key = 'lambda'; if (umap.find(key) == umap.end()) cout << key << ' not found '; else cout << 'Found ' << key << endl; // iterating over all value of umap unordered_mapdouble>::iterator itr; cout<< ' All Elements : '; for (itr = umap.begin(); itr != umap.end(); itr++) { // itr works as a pointer to // pair type // itr->najprv uloží kľúčovú časť a // itr->druhý uloží hodnotu časť cout ' '<< itr->druhý<< endl; } }>

>

>

Výkon

Found PI lambda not found All Elements : e 2.718 loge 1 log10 2.302 Two 2 One 1 Three 3 PI 3.14 root2 1.414 root3 1.732>

Nájdite frekvencie jednotlivých slov

Pri danom reťazci slov je úlohou nájsť frekvenciu jednotlivých slov:

Vstup: str = geeks for geeks geeks quiz practice qa for;
Výkon: Frekvencie jednotlivých slov sú
(cvičenie, 1)
(pre, 2)
(qa, 1)
(kvíz, 1)
(geekovia, 3)

Nižšie je uvedený program C++ na implementáciu vyššie uvedeného prístupu:

C++




// C++ program to find freq> // of every word using unordered_map> #include> using> namespace> std;> > // Prints frequencies of> // individual words in str> void> printFrequencies(>const> string &str)> {> >// declaring map of type,> >// each word is mapped to its frequency> >unordered_mapint>wordFreq; // rozdelenie vstupu do slova pomocou // string stream // Používa sa na rozdelenie slov stringstream ss(str); // Na uloženie jednotlivých slov string word; while (ss>> slovo) wordFreq[slovo]++; // teraz iterujeme cez word, freq pair // a tlačíme ich vo formáte unordered_mapint>:: iterator p; for (p = wordFreq.begin(); p != wordFreq.end(); p++) cout<< '(' ', ' << p->druhý<< ') '; } // Driver code int main() { string str = 'geeks for geeks geeks quiz ' 'practice qa for'; printFrequencies(str); return 0; }>

>

>

shweta tiwari
Výkon

(practice, 1) (for, 2) (qa, 1) (quiz, 1) (geeks, 3)>

Najnovšie články na unordered_map