Мне нужно в мапу 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;
}
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...
Проблема в том, что вы не до конца разобрались в типах контейнеров, которые вы используете. У вас есть 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);
}
}
Внимательно следите за типами данных.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости