Как правильно записать в std::unordered_map?

315
23 января 2018, 12:19

Мне нужно в мапу histogram записать значения. Я записываю, но выдает ошибки. Как правильно записать?

std::unordered_map<char, size_t> histogram;
for (const auto& histogramsThread : histograms)
    histogram.insert(std::make_pair(histogramsThread.cbegin(), histogramsThread.cend()), histogram.end());

UPD меина

int main() 
{
    auto text = ReadDataFromFile("D:\\text.txt");
    const auto textIntervals = GenerateIntervals(text);
    const auto usedThreadCount = textIntervals.size();
    std::vector<std::unordered_map<char, size_t>> 
    histograms(usedThreadCount);
    std::vector<std::thread> threads(usedThreadCount);
    for (std::size_t i = 0; i < usedThreadCount; ++i)
       threads[i] = std::thread(BuildHistogram, std::cref(textIntervals[i]), 
          text, std::ref(histograms[i]));
    for (std::size_t i = 0; i < usedThreadCount; ++i)
        threads[i].join();
    std::unordered_map<char, size_t> histogram;
    for (const auto& histogramsThread : histograms)
        histogram.insert(histogramsThread);
   for (int ch = 0; ch < 256; ++ch) 
   {
        if (text[ch]) 
         {
              std::cout << "Character '" << char(ch) << "' occurs " << 
   text[ch] << " times\n";
         }
   }
   return 0;
}
Answer 1
std::unordered_map<char, size_t> histogram;
for(char c = 'a'; c <= 'z'; ++c)
{
    histogram.insert(make_pair(c,c*c));
}

Вот такое отлично работает.

Но вряд ли у вас в

std::make_pair(histogramsThread.cbegin(), histogramsThread.cend())

cbegin() дает char, а cend() - size_t. Скорее всего, вы как-то не так понимаете работу итераторов или make_pair. А может, и unordered_map...

Answer 2

Проблема в том, что вы не до конца разобрались в типах контейнеров, которые вы используете. У вас есть std::vector, хранящий в себе std::unordered_map<char, size_t>. Соответственно, каждый элемент std::vector является std::unordered_map<char, size_t>. А теперь давайте посмотрим на ваш код:

std::unordered_map<char, size_t> histogram;
for (const auto& histogramsThread : histograms)
    histogram.insert(histogramsThread);

Вы пробегаете по std::vector<std::unordered_map<char, size_t> > и каждый его элемент пытаетесь положить в обычный std::unordered_map<char, size_t>. На лицо несовпадение типов, т.к. insert у std::unordered_map<char, size_t> ожидает в качестве параметра std::pair<char, size_t>, а не другой std::unordered_map.

На вашем месте я бы избегал пользоваться auto до тех пор, пока вы не будете полностью понимать, какой тип будет при использовании данной операции.

Вот простой пример на основании вашего кода, который перебирает все unordered_map в vector и кладет каждую pair в итоговый unordered_map:

// Create final unordered map
std::unordered_map<char, size_t> histogram;
for (const auto &hist : histograms) {
    // hist is std::unordered_map<char, size_t> &
    for (const auto &pair : hist) {
        // pair is std::pair<char, size_t> &
        // which we now can insert into our final map
        histogram.insert(pair);
    }
}

Внимательно следите за типами данных.

READ ALSO
Ожидание потока и присоединение потока &lt;thread&gt;. Где параллелизм?

Ожидание потока и присоединение потока <thread>. Где параллелизм?

Добрый день! Пытаюсь вникнуть в потоки и не могу понять несколько вещей:

248
реализация стека через указатели

реализация стека через указатели

При вводе 0 выводится не число на вершине стека, а какой-то мусорВ чём проблема?

323
Работа с нативным кодом из .Net Core

Работа с нативным кодом из .Net Core

У Microsoft есть статья, посвященная работе с нативным кодов вNet Core на различных платформах

278
Почему вылетает программа после ввода name

Почему вылетает программа после ввода name

Друзья,вылетает программа после ввода поля tabl[i]name; Не могу понять в чём проблема

243