У меня есть unordered_map
из vectors
, и я пытаюсь использовать std::reduce
, чтобы получить сумму всех значений во всех векторах на карте.Мой текущий функциональный код (который я хочу заменить) выглядит следующим образом:
// input is std::unordered_map<std::vector<uint64_t>>
template<typename T>
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;
}
Я хотел бы заменить это на std::reduce
, чтобы использовать параллельное выполнение;Я думал, что это будет просто, так как мне нужно было только заменить каждый цикл вызовом std::reduce
, но это, похоже, не работает.Моя попытка заключается в следующем:
#include <numeric>
#include <execution>
#include <vector>
#include <unordered_map>
#include <cstdint>
// reduces the vectors
template <typename Iter, typename T>
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<typename Iter>
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<std::vector<uint64_t>::iterator,
uint64_t>(cur.begin(), cur.end(), prev);
//return get_vector_sum<std::vector<uint64_t>::iterator,
// uint64_t>(cur.second.begin(), cur.second.end(), prev);
});
}
С кодом выше, я получаю сообщение об ошибке, говорящее error C2039: 'begin': is not a member of 'std::pair'
со ссылкой на auto cur
в лямбда внутри get_map_sum
.Первоначально я использовал cur
как std::pair
, но когда я это сделал, у меня появилась другая ошибка: error C2228: left of '.second' must have class/struct/union
.
int main()
{
std::unordered_map<uint64_t, std::vector<uint64_t>> in({
{1, std::vector<uint64_t>{1,2,3,4,5} },
{2, std::vector<uint64_t>{1,2,3,4,5}},
{3, std::vector<uint64_t>{1,2,3,4,5}}});
auto x = get_map_sum(in); // output 45
auto y = get_map_sum(in.begin(), in.end()); // error
return 0;
}
Можно ли использовать std::reduce
с картами, подобными этой, и,если да, какие изменения мне нужно сделать, чтобы это работало?