如何使用基于范围的 'for' 循环遍历不同类型的地图集合?
How to iterate through a collection of maps of different kinds using range based 'for' loops?
我可以按如下方式遍历地图:
std::map<int, std::string> intMap = { {1, "one"}, {2, "two"}, {3, "three"} };
for (const auto &[k, v]: intMap)
{
doSomething(k, v);
}
我有另一个地图(不同类型和大小)定义如下:
std::map<float, std::string> floatMap = { {1.0, "one"}, {2.0, "two"}};
我也想为这张地图做同样的事情(doSomething(k, v)
已模板化)
for (const auto &[k, v]: floatMap)
{
doSomething(k, v);
}
有没有一种方法可以通过遍历地图集合来对这两个地图执行此操作?
类似于:
for (const auto &map: {intMap, floatMap})
{
for (const auto &[k, v]: map)
{
doSomething(k, v);
}
}
然而,这给出了错误:
cannot deduce type of range in range-based 'for' loop
使用基于范围的 'for' 循环遍历一组地图(不同种类)的最简洁的方法 (> C++17) 是什么?
谢谢!
您可以使用折叠表达式展开立即调用的 lambda 来执行此操作:
[](const auto&... maps) {
([&] {
for (const auto& [k, v] : maps)
doSomething(k, v);
}(), ...);
}(intMap, floatMap);
我可以按如下方式遍历地图:
std::map<int, std::string> intMap = { {1, "one"}, {2, "two"}, {3, "three"} };
for (const auto &[k, v]: intMap)
{
doSomething(k, v);
}
我有另一个地图(不同类型和大小)定义如下:
std::map<float, std::string> floatMap = { {1.0, "one"}, {2.0, "two"}};
我也想为这张地图做同样的事情(doSomething(k, v)
已模板化)
for (const auto &[k, v]: floatMap)
{
doSomething(k, v);
}
有没有一种方法可以通过遍历地图集合来对这两个地图执行此操作?
类似于:
for (const auto &map: {intMap, floatMap})
{
for (const auto &[k, v]: map)
{
doSomething(k, v);
}
}
然而,这给出了错误:
cannot deduce type of range in range-based 'for' loop
使用基于范围的 'for' 循环遍历一组地图(不同种类)的最简洁的方法 (> C++17) 是什么?
谢谢!
您可以使用折叠表达式展开立即调用的 lambda 来执行此操作:
[](const auto&... maps) {
([&] {
for (const auto& [k, v] : maps)
doSomething(k, v);
}(), ...);
}(intMap, floatMap);