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

Using Structured binding declaration in Range-based for loop

本文关键字:循环 结构化 声明 绑定 for 于范围 范围      更新时间:2023-10-16

我正在尝试将两个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;
}

但是,我如何使用基于Range的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}};

那么"foobar"应该是:

std::map<int, int> foobar = {{1, 10}, {2, 20}, {3, 80}, {4, 60}};

这一切都是在基于循环的单个范围内完成的

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

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

for(auto[k, v] : foo) foobar[k] += v;
for(auto[k, v] : bar) foobar[k] += v;

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

foobar = foo;
for(auto[k, v] : bar) foobar[k] += v;

有一个标准的库算法可以做到这一点:std::set_union,在<algorithm>中。当然,这很难看,因为它使用迭代器对,但您可能可以使用范围来改进这一点。

总之:

std::set_union(
foo.begin(), foo.end(), 
bar.begin(), bar.end(),
std::inserter(foobar, foobar.begin())
);

应该做到这一点。


PS-这可能有点慢-因为std::map本身确实很慢。我想你不在乎这个地图的性能(或者它真的很小(,否则你就不应该使用它。