У меня есть Unoromeded_map vectors , и я пытаюсь использовать std :: code , чтобы получить сумму всех значений во всех векторах на карте. Мой текущий функциональный код (который я хочу заменить) выглядит так: < /p>
// input is std::unordered_map
template
uint64_t get_map_sum(T& my_map)
{
uint64_t totalcount = 0;
for (auto& p : my_map)
{
for (const auto& q : p.second)
totalcount += q;
}
return total_count;
}
< /code>
Я бы хотел заменить это на std :: code>, чтобы использовать параллельное выполнение; Я думал, что это будет просто, так как мне нужно было заменить каждый цикл на вызов на STD :: CREAND
#include
#include
#include
#include
#include
// reduces the vectors
template
T get_vector_sum(Iter begin, Iter end, T initial = 0)
{
return std::reduce(std::execution::par_unseq, begin, end, initial,
[&](auto cur, auto prev) { return cur + prev; });
}
// calls get_vector_sum for all vectors and then reduces vector sums
template
uint64_t get_map_sum(Iter begin, Iter end)
{
return std::reduce(std::execution::par_unseq, begin, end, 0ULL,
[&](auto prev, auto cur)
{
return get_vector_sum(cur.begin(), cur.end(), prev);
//return get_vector_sum(cur.second.begin(), cur.second.end(), prev);
});
}
С приведенным выше кодом я получаю сообщение об ошибке, в которой говорится об ошибке C2039: 'begin': не является членом 'std :: pare' , ссылаясь на Auto cur в лямбде внутри get_map_sum . Первоначально я использовал cur в качестве std :: pare , но когда я это сделал, я получил другую ошибку, говоря об ошибке C2228: слева от '.second' должен иметь класс/struct/union .
У меня есть Unoromeded_map vectors , и я пытаюсь использовать std :: code , чтобы получить сумму всех значений во всех векторах на карте. Мой текущий функциональный код (который я хочу заменить) выглядит так: < /p>
[code]// input is std::unordered_map template uint64_t get_map_sum(T& my_map) { uint64_t totalcount = 0; for (auto& p : my_map) { for (const auto& q : p.second) totalcount += q; } return total_count; } < /code>
Я бы хотел заменить это на std :: code>, чтобы использовать параллельное выполнение; Я думал, что это будет просто, так как мне нужно было заменить каждый цикл на вызов на STD :: CREAND [/code], но это не работает. Моя попытка такова: < /p>
[code]#include #include #include #include #include // reduces the vectors template T get_vector_sum(Iter begin, Iter end, T initial = 0) { return std::reduce(std::execution::par_unseq, begin, end, initial, [&](auto cur, auto prev) { return cur + prev; }); }
// calls get_vector_sum for all vectors and then reduces vector sums template uint64_t get_map_sum(Iter begin, Iter end) { return std::reduce(std::execution::par_unseq, begin, end, 0ULL, [&](auto prev, auto cur) { return get_vector_sum(cur.begin(), cur.end(), prev); //return get_vector_sum(cur.second.begin(), cur.second.end(), prev); }); } [/code]
С приведенным выше кодом я получаю сообщение об ошибке, в которой говорится об ошибке C2039: 'begin': не является членом 'std :: pare' , ссылаясь на Auto cur в лямбде внутри get_map_sum . Первоначально я использовал cur в качестве std :: pare , но когда я это сделал, я получил другую ошибку, говоря об ошибке C2228: слева от '.second' должен иметь класс/struct/union .