Инициализировать c ++ 14 unordered_map с k сегментами с нулевой парой ключ-значение - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь создать unordered_map с минимальным количеством начальных сегментов (k), со всеми парами ключ-значение, инициализированными в ноль.Позже он должен войти в цикл for и вывести значения.

int someFunction(int k){
  unordered_map<int, int> majority(k, {0,0});
}

for(auto m : majority){
  cout << m.first << " " <<  m.second << " \n";
}

Я получаю следующую ошибку компиляции (c ++ 14):

no matching function for call to ‘std::unordered_map<int, int>::unordered_map(int&, <brace-enclosed initializer list>)

Есть ли способ, которым я могу достичь этого?

Ответы [ 2 ]

1 голос
/ 23 июня 2019

std::unordered_map поддерживает только уникальные ключи, поэтому конструктор не существует.

Если вы хотите один и тот же ключ несколько раз, вы можете использовать std::unordered_multimap.См. ссылку для доступных конструкторов.

#include <iostream>
#include <unordered_map>

int main() {

    std::unordered_multimap<int, int> map;
    const int k = 5;

    for (int i = 0; i < k; ++i)
    {
        map.emplace(0, 0);
    }

    for (auto& kv: map)
    {
        std::cout << kv.first << " " << kv.second << std::endl;
    }

}
0 голосов
/ 23 июня 2019

unordered_map представляет структуру данных хеша.По определению хеша каждый ключ должен быть уникальным.Таким образом, вы не можете инициализировать большинство с несколькими нулевыми ключами int.Вместо этого вы можете использовать функцию резерва:

пустой резерв (size_type n);

Запросить изменение емкости

Устанавливает количество контейнеров в контейнере (bucket_count)к наиболее подходящему, чтобы содержать как минимум n элементов.

Если n больше текущего bucket_count, умноженного на max_load_factor, значение bucket_count контейнера увеличивается, и перефразировка принудительная.

Если n равнониже этого значения функция может не действовать.

...