遍历 unordered_maps cpp 的无序映射中的元素
iterating through elements in unordered map of unordered_maps cpp
假设我有一个 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。我该怎么做?
一种方法是像这样使用 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
。
另一个选项是基于范围的 for 循环。使用结构化绑定(在 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);
int32_t sum = 0;
for (auto& p : f_table[1])
{
sum += p.second
}
假设我有一个 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。我该怎么做?
一种方法是像这样使用 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
。
另一个选项是基于范围的 for 循环。使用结构化绑定(在 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);
int32_t sum = 0;
for (auto& p : f_table[1])
{
sum += p.second
}