logo

unordered_map v C++ STL

neuspořádaná_mapa je přidružený kontejner, který ukládá prvky tvořené kombinací hodnoty klíče a namapované hodnoty. Hodnota klíče se používá k jedinečné identifikaci prvku a mapovaná hodnota je obsah spojený s klíčem. Klíč i hodnota mohou být libovolného typu předdefinovaného nebo definovaného uživatelem. Jednoduše řečeno, an neuspořádaná_mapa je jako datová struktura typu slovníku, která v sobě ukládá prvky. Obsahuje po sobě jdoucí páry (klíč, hodnota), což umožňuje rychlé vyhledání jednotlivého prvku na základě jeho jedinečného klíče.

římská čísla 1 až 100

Interně unordered_map je implementována pomocí Hash Table , klíč poskytnutý k mapování je hašován do indexů hašovací tabulky, což je důvod, proč výkon datové struktury hodně závisí na hašovací funkci, ale v průměru náklady na hledat, vkládat a mazat z hash tabulky je O(1).



Poznámka: V nejhorším případě se jeho časová složitost může pohybovat od O(1) do O(n), zejména u velkých prvočísel. V této situaci je velmi vhodné místo toho použít mapu, abyste se vyhnuli chybě TLE (Time Limit Exceeded).

Syntax:

unordered_map syntaxe s příkladem

unordered_map syntaxe



Níže je uveden program C++, který demonstruje neuspořádanou mapu:

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; // vložení hodnot pomocí operátoru [] umap['techcodeview.com'] = 10; umap['Cvičení'] = 20; umap['Contribute'] = 30; // Procházení neuspořádané mapy pro (auto x : umap) cout<< x.first << ' ' << x.second << endl; }>

>

>

Výstup

Contribute 30 Practice 20 techcodeview.com 10>
unordered_map Výstup s příkladem

unordered_map Výstup

Vysvětlení: Specifická věc, kterou tento výstup ospravedlňuje, je to, že hodnota výsledku unordered_map je vytvářena náhodným způsobem klíč k hodnotě, zatímco mapa zobrazuje hodnotu a klíč uspořádaným způsobem.

unordered_map vs unordered_set

Neuspořádaná_mapa

Neuspořádaná_sada

Unordered_map obsahuje prvky pouze ve formě párů (klíč-hodnota). Unordered_set nemusí nutně obsahovat prvky ve formě párů klíč-hodnota, ty se používají hlavně k zobrazení přítomnosti/nepřítomnosti sady.
Operátor' []' extrahovat odpovídající hodnotu klíče, který je přítomen v mapě. Hledání prvku se provádí pomocí a nalézt () funkce. Není tedy potřeba operátor[].

Poznámka: Vezměme si například problém počítání frekvencí jednotlivých slov. Nemůžeme použít unordered_set (nebo set), protože nemůžeme ukládat počty, zatímco můžeme použít unordered_map.

unordered_map vs mapa

Neuspořádaná_mapa

Mapa

Klíč unordered_map lze uložit v libovolném pořadí. Mapa je uspořádaná sekvence jedinečných klíčů
Unordered_Map implementuje nevyváženou stromovou strukturu, kvůli které není možné udržovat pořádek mezi prvky Mapa implementuje vyváženou stromovou strukturu, proto je možné udržovat pořádek mezi prvky (konkrétním procházením stromu)
Časová složitost operací unordered_map je v průměru O(1). Časová složitost mapových operací je O(log n)

Metody na unordered_map

K dispozici je mnoho funkcí, které fungují na unordered_map. Nejužitečnější z nich jsou:

    operator = operator [] prázdná velikost začátku a konce kapacity iterátoru. najít a spočítat pro vyhledání. vložit a vymazat pro úpravu.

Níže uvedená tabulka ukazuje úplný seznam metod unordered_map:

Metody/Funkce

Popis

na() Tato funkce v C++ unordered_map vrací odkaz na hodnotu s prvkem jako klíč k
začít() Vrátí iterátor ukazující na první prvek v kontejneru v kontejneru unordered_map
konec() Vrátí iterátor ukazující na pozici za posledním prvkem v kontejneru v kontejneru unordered_map
Kbelík() Vrátí číslo segmentu, kde se na mapě nachází prvek s klíčem k
bucket_count Bucket_count se používá k počítání celkového počtu. bucketů v unordered_map. Pro přechod do této funkce není vyžadován žádný parametr
bucket_size Vrátí počet prvků v každém segmentu unordered_map
počet() Spočítejte počet prvků přítomných v unordered_map s daným klíčem
stejný_rozsah Vraťte hranice rozsahu, který zahrnuje všechny prvky v kontejneru, s klíčem, který se rovná k
nalézt() Vrátí iterátor prvku
prázdný() Zkontroluje, zda je kontejner prázdný v kontejneru unordered_map
vymazat() Vymazat prvky v kontejneru v kontejneru unordered_map

Knihovna C++11 také poskytuje funkce pro zobrazení interně používaného počtu segmentů, velikosti segmentu a také použité hašovací funkce a různých hašovacích zásad, ale v reálných aplikacích jsou méně užitečné. Můžeme iterovat přes všechny prvky unordered_map pomocí Iteratoru.

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žení prvku přímo do mapy {'Jedna', 1}, {'Dva', 2}, {'Tři', 3} }; // vložení hodnot pomocí operátoru [] umap['PI'] = 3.14; umap['root2'] = 1,414; umap['root3'] = 1,732; umap['log10'] = 2,302; umap['loge'] = 1,0; // vložení hodnoty funkcí insert umap.insert(make_pair('e', 2.718)); klíč řetězce = 'PI'; // Pokud klíč nebyl nalezen v iterátoru mapy // to end je vráceno 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->nejprve uloží klíčovou část a // itr->second uloží hodnotu část cout ' '<< itr->druhý<< endl; } }>

>

>

string.format v jazyce Java
Výstup

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>

Najděte frekvence jednotlivých slov

Vzhledem k řetězci slov je úkolem najít frekvence jednotlivých slov:

Vstup: str = geeks for geeks geeks quiz practice qa for;
Výstup: Frekvence jednotlivých slov jsou
(cvičení, 1)
(pro, 2)
(qa, 1)
(kvíz, 1)
(geekové, 3)

Níže je uveden program C++ pro implementaci výše uvedeného pří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; // rozdělení vstupu na slovo pomocí // string stream // Používá se pro rozdělení slov stringstream ss(str); // Pro uložení jednotlivých slov string word; while (ss>> slovo) wordFreq[slovo]++; // nyní iteruji přes word, freq pair // a tiskneme je ve formátu 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; }>

>

>

Výstup

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

Nejnovější články na unordered_map