Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是循环遍历几个元组的基于范围的for循环的简明表示法_C++_C++17 - Fatal编程技术网

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);