在基于范围的for循环中使用结构化绑定声明
Using Structured binding declaration in Range-based for loop
我正在尝试将两个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
容器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(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
本身确实很慢。我想你不在乎这个地图的性能(或者它真的很小(,否则你就不应该使用它。
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在基于范围的for循环中使用结构化绑定声明
- 使用结构化绑定'Reflection'
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 为什么 boost::comb 对结构化绑定的支持缺少结构化绑定机制对 boost::tuples::cons 的适应?
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- C++,每个循环初始化一个新的静态变量
- 在 C++14 中手动实现结构化绑定
- 为什么结构化绑定不支持可变数组?
- 为<vtkDataArray> VTK 非结构化网格声明 vtkSmartPointer 类型的变量时出现问题
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 是否有像ADTF2这样的结构化属性?
- 带有 std::minmax 和 rvalues 的结构化绑定
- 在无序映射的结构化绑定中推导类型
- 为什么基于范围的 for 循环中的结构化绑定只是一个副本而不是引用?
- 您自己的类型的结构化绑定,不是结构或元组(通过公共成员函数)
- 共享或私有 openmp 代码中的结构化类型变量
- 结构化绑定:遍历元组的双端面
- 结构化绑定是否适用于 std::vector?
- 在for循环初始化语句中声明未命名结构体