logo

unordered_map у C++ STL

unordered_map це асоційований контейнер, який зберігає елементи, утворені комбінацією значення ключа та зіставленого значення. Значення ключа використовується для унікальної ідентифікації елемента, а зіставлене значення є вмістом, пов’язаним із ключем. І ключ, і значення можуть бути будь-якого типу, попередньо визначеного або визначеного користувачем. Простіше кажучи, ан unordered_map це як структура даних словникового типу, яка зберігає елементи в собі. Він містить послідовні пари (ключ, значення), що дозволяє швидко знайти окремий елемент на основі його унікального ключа.

рекха індійська

Внутрішньо unordered_map реалізовано за допомогою хеш-таблиці, ключ, наданий для відображення, хешується в індекси хеш-таблиці, тому продуктивність структури даних значною мірою залежить від хеш-функції, але в середньому вартість пошук, вставка та видалення з хеш-таблиці дорівнює O(1).



Примітка: У гіршому випадку його часова складність може переходити від O(1) до O(n), особливо для великих простих чисел. У цій ситуації настійно рекомендується використовувати карту, щоб уникнути помилки TLE (Time Limit Exceeded).

Синтаксис:

синтаксис unordered_map із прикладом

синтаксис unordered_map



Нижче наведено програму C++ для демонстрації невпорядкованої карти:

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; // вставка значень за допомогою оператора [] umap['techcodeview.com'] = 10; umap['Практика'] = 20; umap['Contribute'] = 30; // Обхід невпорядкованої карти для (auto x : umap) cout<< x.first << ' ' << x.second << endl; }>

>

>

Вихід

Contribute 30 Practice 20 techcodeview.com 10>
unordered_map Вихід із прикладом

unordered_map Вихід

Пояснення: Специфічною річчю, яку виправдовує цей вихід, є те, що значення результату unordered_map створюється у випадковому порядку від ключа до значення, тоді як карта відображає значення та ключ у впорядкованому порядку.

unordered_map проти unordered_set

Unordered_map

Невпорядкований_набір

Unordered_map містить елементи лише у формі пар (ключ-значення). Unordered_set не обов’язково містить елементи у формі пар ключ-значення, вони в основному використовуються, щоб побачити наявність/відсутність набору.
оператор []' щоб отримати відповідне значення ключа, який присутній у карті. Пошук елемента виконується за допомогою a знайти () функція. Тому оператор [].

Примітка: Наприклад, розглянемо задачу підрахунку частот окремих слів. Ми не можемо використовувати unordered_set (або set), оскільки ми не можемо зберігати підрахунки, хоча ми можемо використовувати unordered_map.

unordered_map проти карти

Unordered_map

Карта

Ключ unordered_map можна зберігати в будь-якому порядку. Карта — це впорядкована послідовність унікальних ключів
Unordered_Map реалізує незбалансовану деревовидну структуру, через яку неможливо підтримувати порядок між елементами Карта реалізує збалансовану структуру дерева, тому можна підтримувати порядок між елементами (шляхом певного обходу дерева)
Часова складність операцій unordered_map в середньому становить O(1). Часова складність операцій з картою становить O(log n)

Методи на unordered_map

Доступно багато функцій, які працюють на unordered_map. Найкорисніші з них:

    operator = operator [] порожній розмір для початку та кінця ємності для ітератора. знайти та підрахувати для пошуку. вставити та стерти для модифікації.

У таблиці нижче показано повний список методів unordered_map:

Методи/Функції

опис

в() Ця функція в C++ unordered_map повертає посилання на значення з елементом як ключ k
почати() Повертає ітератор, що вказує на перший елемент у контейнері unordered_map
кінець() Повертає ітератор, що вказує на позицію після останнього елемента в контейнері в контейнері unordered_map
відро() Повертає номер сегмента, де на карті розташований елемент із ключем k
bucket_count Bucket_count використовується для підрахунку загальної кількості. відер у unordered_map. Жоден параметр не потрібен для передачі в цю функцію
bucket_size Повертає кількість елементів у кожному сегменті unordered_map
рахувати() Підрахувати кількість елементів у unordered_map із заданим ключем
рівний_діапазон Повертає межі діапазону, який включає всі елементи в контейнері, за допомогою ключа, порівняння якого дорівнює k
знайти() Повертає ітератор до елемента
порожній() Перевіряє, чи порожній контейнер у контейнері unordered_map
стерти() Видалити елементи в контейнері в контейнері unordered_map

Бібліотека C++11 також надає функції для перегляду внутрішньо використовуваної кількості сегментів, розміру сегментів, а також використаної хеш-функції та різних хеш-політик, але вони менш корисні в реальних програмах. Ми можемо перебирати всі елементи unordered_map за допомогою Iterator.

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 = { //вставлення елемента безпосередньо в карту {'One', 1}, {'Two', 2}, {'Three', 3} }; // вставка значень за допомогою [] operator umap['PI'] = 3.14; umap['root2'] = 1,414; umap['root3'] = 1,732; umap['log10'] = 2,302; umap['loge'] = 1,0; // вставка значення за допомогою функції вставки umap.insert(make_pair('e', 2.718)); ключ рядка = 'PI'; // Якщо ключ не знайдено в ітераторі карти // to end повертається 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>::ітератор itr; cout<< ' All Elements : '; for (itr = umap.begin(); itr != umap.end(); itr++) { // itr works as a pointer to // pair type // itr->перший зберігає ключову частину, а // itr->другий зберігає значення cout ' '<< itr->другий<< endl; } }>

>

python os listdir

>

Вихід

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>

Знайдіть частотність окремих слів

Дано рядок слів, завдання полягає в тому, щоб знайти частоти окремих слів:

введення: str = geeks для geeks geeks quiz practice qa for;
Вихід: Частоти окремих слів є
(практика, 1)
(для, 2)
(qa, 1)
(тест, 1)
(гіки, 3)

Нижче наведено програму C++ для реалізації вищезазначеного підходу:

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; // розбиття введення на слово за допомогою // потоку рядків // Використовується для розбиття слів stringstream ss(str); // Для збереження окремих слів string word; while (ss>> слово) wordFreq[слово]++; // тепер ітерація слова, пари частот // і друк їх у форматі unordered_mapint>:: iterator p; for (p = wordFreq.begin(); p != wordFreq.end(); p++) cout<< '(' ', ' << p->другий<< ') '; } // Driver code int main() { string str = 'geeks for geeks geeks quiz ' 'practice qa for'; printFrequencies(str); return 0; }>

>

>

Вихід

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

Останні статті на unordered_map