как unordered_map инициализируется со значениями массива - PullRequest
0 голосов
/ 02 февраля 2019

Я столкнулся с кодом, в котором я запутался, unordered_map инициализируется, как показано ниже

std::unordered_map<std::string, int> wordMap;

// Inserting elements through an initializer_list
wordMap.insert({ {"First", 1}, {"Second", 2}, {"Third", 3} } );

Но что меня удивляет, так это код ниже

int arr[] = { 1, 5, 2, 1, 3, 2, 1 };
unordered_map<int, int> hash; 
    for (int i = 0; i < n; i++) 
        hash[arr[i]]++;

Здесь я неузнать, как ключ и значение вставляются в карту

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Здесь In unordered_map, hash[arr[i]]++; работает следующим образом:

  1. Поиск ключа (arr [i]).Если оно найдено, соответствующее значение увеличивается на 1.

  2. Если оно не найдено, будет создан новый элемент с ключом arr[i], и поскольку значение имеет типint, для него сохраняется значение по умолчанию 0.Из-за оператора ++ он будет увеличен на единицу.Таким образом, в конце операции значение будет 1.

Чтобы быть очень явным для вашего примера, оно работает так:

i = 0 => arr[i] = 1 => Not present in map => New pair added => hash: [{1, 1}]
i = 1 => arr[i] = 5 => Not present in map => New pair added => hash: [{1, 1}, {5, 1}]
i = 2 => arr[i] = 2 => Not present in map => New pair added => hash: [{1, 1}, {5, 1}, {2, 1}]
i = 3 => arr[i] = 1 => Present in map => Existing pair updated => hash: [{1, 2}, {5, 1}, {2, 1}]
i = 4 => arr[i] = 3 => Not present in map => New pair added => hash: [{1, 2}, {5, 1}, {2, 1}, {3, 1}]
i = 5 => arr[i] = 2 => Present in map => Existing pair updated => hash: [{1, 2}, {5, 1}, {2, 2}, {3, 1}]
i = 6 => arr[i] = 1 => Present in map => Existing pair updated => hash: [{1, 3}, {5, 1}, {2, 2}, {3, 1}]

Упомянутый здесь порядок может отличаться от фактического.Приведенное выше объяснение просто для объяснения вещей.

0 голосов
/ 02 февраля 2019

Ключ неупорядоченной карты должен быть уникальным, поэтому все 1: s будут объединены.Но когда они объединятся, цикл добавит 1 к стороне значения:

hash [arr [i]] ++ будет равен этому примеру: hash [1] + = 1;

Поскольку существует три значения 1, хэш [1] будет иметь значение 3. Вы найдете две записи значения 2, и это сделает хэш [2] = 2.

#include <iostream>
#include <unordered_map>

int main()
{
    int arr[] = { 1, 5, 2, 1, 3, 2, 1 };
    std::unordered_map<int, int> hash; 
    for (int i = 0; i < 7; i++) {
        hash[arr[i]] += 1;
    }
    for (auto i : hash) {
        printf("%i:%i\n", i.first, i.second);
    }
}
# Output:
#   3:1
#   2:2
#   5:1
#   1:3
0 голосов
/ 02 февраля 2019

operator [] проверяет, существует ли элемент.Если это не так, он создает конструктор по умолчанию и возвращает ссылку (или постоянную ссылку на него).то есть:

 hash[arr[0]]++
 it creates hash[1]first 

, то есть

hash[1]++ => hash[1]=hash[1]+1 which is 0+1 ( since hash[1] at the begining was 0 by default.. )
when it get to the second 1 it become hash[1]=hash[1]+1 = 2 ...

..ect same for other values

, в основном это создает и подсчитывает количество дубликатов в массиве

в конце, это дает вам

hash[1]=3
hash[2]=2
hash[3]=1
hash[5]=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...