在基于范围的 for 循环中使用结构化绑定声明

Nit*_*gla 1 c++ for-loop c++17 structured-bindings

我正在尝试将两个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;
    }
Run Code Online (Sandbox Code Playgroud)

但是我如何使用基于范围的 for 循环(也许与结构化绑定声明结合使用)来实现相同的目的?

或者有没有更好的方法来组合这两个关联容器?

编辑:这个问题的预期答案应该采用两个容器(std::map此处)并将它们组合成一个联合/联合映射,其中键来自各自的关联容器,并且添加重复键的值。

示例: 如果给定std::map容器foobar是:

  std::map<int, int> foo = {{1, 10}, {2, 20}, {3, 30}};
  std::map<int, int> bar = {{3, 50}, {4, 60}};
Run Code Online (Sandbox Code Playgroud)

那么“foobar”应该是:

  std::map<int, int> foobar = {{1, 10}, {2, 20}, {3, 80}, {4, 60}};
Run Code Online (Sandbox Code Playgroud)

这一切都在一个基于 Range 的 for 循环中完成。

Ted*_*gmo 7

有没有更好的方法来组合这两个关联容器?

最简单的方法可能是分别迭代它们:

for(auto[k, v] : foo) foobar[k] += v;
for(auto[k, v] : bar) foobar[k] += v;
Run Code Online (Sandbox Code Playgroud)

如果您想丢弃 中已有的任何数据foobar

foobar = foo;
for(auto[k, v] : bar) foobar[k] += v;
Run Code Online (Sandbox Code Playgroud)