【发布时间】:2020-07-13 07:45:57
【问题描述】:
我正在尝试将两个 std::map 容器(例如 std::map<int, int> foo, bar)组合成第三个 std::map(例如 std::map<int, int> foobar)。
我知道我可以使用以下迭代器来实现这一点:
std::map<int, int>::iterator itr1 = foo.begin();
std::map<int, int>::iterator itr2 = bar.begin();
for (; itr1 != foo.end() && itr2 != bar.end(); ++itr1, ++itr2)
{
foobar[itr1->first] += itr1->second;
foobar[itr2->first] += itr2->second;
}
但是我如何使用基于范围的 for 循环(也许,结合结构化绑定声明)来实现相同的效果?
或者有没有更好的方法来组合这两个关联容器?
编辑:这个问题的预期答案应该采用两个容器(此处为std::map)并将它们组合成一个联合/联合映射,其中键来自各自的关联容器和添加的重复键的值。
示例:
如果给定std::map 容器foo 和bar 是:
std::map<int, int> foo = {{1, 10}, {2, 20}, {3, 30}};
std::map<int, int> bar = {{3, 50}, {4, 60}};
那么 `foobar' 应该是:
std::map<int, int> foobar = {{1, 10}, {2, 20}, {3, 80}, {4, 60}};
这一切都在一个单个基于范围的 for 循环中完成。
【问题讨论】:
-
只需搜索 C++ zip 范围;这一直出现
-
看起来像是 What's the best way to iterate over two or more containers simultaneously 的骗子——它涵盖了 range-
for和结构化绑定。 -
@DanielLangr - 谢谢!但是最热门的答案中的链接已损坏。
-
请注意,如果两个容器的大小不同,您的循环将遍历较短容器的末端。
标签: c++ for-loop c++17 structured-bindings