перебирая элементы в неупорядоченной карте unordered_maps cpp - PullRequest
0 голосов
/ 12 сентября 2018

Предположим, у меня есть unordered_map, как указано ниже:

unordered_map<int, unordered_map<int, int>> f_table;
f_table[1][3] = 10;
f_table[1][2] = 1;
f_table[1][1] = 2;
f_table[2][3] = 11;
f_table[2][2] = 22;
f_table[2][1] = 4;
f_table[3][3] = 1;
f_table[3][2] = 3;
f_table[3][1] = 2;

И я хотел бы суммировать все элементы в f_table [1], которые должны добавить до 13. Как бы я поступил?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018
int32_t sum = 0;
for (auto& p : f_table[1])
{
    sum += p.second
}
0 голосов
/ 12 сентября 2018

Один подход использует std::accumulate, например:

#include <numeric>

const int result = std::accumulate(f_table[1].cbegin(), f_table[1].cend(),
    0, [](int result, const auto& entry){ return result + entry.second; });

Обратите внимание, что как @StoryTeller указал в комментариях, вы можете предпочесть параллельную версию этого алгоритма, которая будет поставляться с полностью соответствующими реализациями C ++ 17, то есть std::reduce.

Другой вариант - диапазон, основанный на цикле. Со структурированными привязками (снова доступны в C ++ 17), вы можете считать это более читабельным:

int result = 0;

for (const auto& [key, value] : f_table[1])
   result += value;

И, наконец, решение, основанное на range-v3 :

#include <range/v3/all.hpp>

using ranges::view::values;
using ranges::accumulate;

const int result = accumulate(f_table[1] | values, 0);
...