C++ 什么是循环遍历几个元组的基于范围的for循环的简明表示法
是否有更简单(更短)的方法将此代码段作为循环编写:C++ 什么是循环遍历几个元组的基于范围的for循环的简明表示法,c++,c++17,C++,C++17,是否有更简单(更短)的方法将此代码段作为循环编写: for (auto [a, b]: {pair<int, int>{1, 2}, pair<int, int>{3, 4}}) foo(a, b); 有一种较短的方法,它涉及到构建一个临时的std::map 您可以这样做: for (auto [a, b]: map<int, int>{{1, 2}, {3, 4}}) foo(a, b); for(自动[a,b]:映射{{1,2},{
for (auto [a, b]: {pair<int, int>{1, 2}, pair<int, int>{3, 4}})
foo(a, b);
有一种较短的方法,它涉及到构建一个临时的
std::map
您可以这样做:
for (auto [a, b]: map<int, int>{{1, 2}, {3, 4}})
foo(a, b);
for(自动[a,b]:映射{{1,2},{3,4})
foo(a,b),;
这是一份汇编。看到了
或者按照@Jarod42的建议,您也可以使用std::initializer\u list
for (auto [a, b]: std::initializer_list<std::pair<int, int>>{{1, 2}, {3, 4}})
for(auto[a,b]:std::initializer_list{{{1,2},{3,4})
您必须再多键入一点。:) > C++是一种强类型的语言,从编译器推导的类型中可以看出模糊性的限制。两级未指定的大括号就是一个例子 您可以使用简单的typedef将其缩短:
using pair_list = std::initializer_list<std::pair<int, int>>;
for (auto [a, b]: pair_list{{1, 2}, {3, 4}})
foo(a, b);
使用pair\u list=std::initializer\u list;
for(auto[a,b]:配对列表{{1,2},{3,4})
foo(a,b),;
。您可以根据需要优化/选择临时文件的类型。仍然有点冗长,但此模板可能会有所帮助:
template <class T>
constexpr auto asPairs(std::initializer_list<std::pair<T, T>> args)
{
return args;
}
模板
constexpr auto-asPairs(标准::初始值设定项\u列表参数)
{
返回args;
}
它可以像下面那样被实例化和使用
for (auto [a, b] : asPairs<int>({{1, 2}, {3, 4}}))
foo(a, b);
for(auto[a,b]:asPairs({{1,2},{3,4}))
foo(a,b),;
多亏了《扣减指南》,您可以在C++17中执行以下操作:
for (auto [a, b]: {std::pair{1, 2}, std::pair{3, 4}})
foo(a, b);
甚至
for (auto [a, b]: {std::pair{1, 2}, {3, 4}})
foo(a, b);
cough macr cough o.
do{foo(1,2);foo(3,4);}while(false)代码>;-)@Jarod42您在法律上是正确的!;-)<代码>标准::初始值设定项\u列表
也应该做这项工作。@Jarod42:谢谢。更新。map
看起来不错,但可能会成为内部循环中的性能杀手。@PaulJurczak:是的,我是为了最短的时间。:)哦在那里,我到处乱搞课程和演绎指南。真漂亮!由于我通常不使用std::
,因此您的解决方案实际上是最简洁、最灵活的解决方案。大致来说:for(auto[I,j,k]:{tuple{.1,5,5},tuple{.4,5,6})
@PaulJurczak-您可以再短一点。只有第一项必须显式为一对。第二个将根据第一个推论。@rubenvb你所说的尺度是什么意思?编译时惩罚?@Paul列表中的每个元素都需要在前面加上一个typename。但我并没有看到说书人的评论,这使我的观察无效。没关系:)。
for (auto [a, b]: {std::pair{1, 2}, {3, 4}})
foo(a, b);