基于范围的循环如何与for-each循环不同?

时间:2012-04-17 11:07:39

标签: c++ for-loop c++11

最新的C ++ 11规范定义了一种称为“基于范围的循环”的新型for循环。 它的外观和机制似乎与其他语言中的for-each循环非常相似。

如果有的话,他们俩之间有什么区别?如果为什么新名称没有差异?

编辑:为了澄清,我不是在寻找每个或std :: for_each的“基于...的范围”与其他语言之间的实现差异。相反,我想知道是否有一些隐藏的价值背后的事实,他们决定称这个新的c ++“功能”(或语法,或成语或任何你想称之为)“基于范围的循环”而不是“为每个循环“就像其他任何人似乎都在呼唤这些东西。

3 个答案:

答案 0 :(得分:14)

语法:

for ( range_declaration : range_expression) loop_statement  

产生的代码相当于:

{
    auto && __range = range_expression ; 
    auto __begin = begin_expr(__range); 
    auto __end = end_expr(__range); 
    for (;__begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    } 
} 

std::for_each将一元函数应用于指定范围。所以,有两个基本的区别:

  • 基于范围的for循环语法更清晰,更通用,但是您不能在循环中执行不同于begin()end()的指定范围的代码。
  • 通过定义begin()end()函数,可以将基于范围的for循环应用于未定义迭代器的容器。

你无法将它与“广义的每个成语”进行比较,因为没有标准的习语。要进行比较,您必须指出具体实施,差异通常隐藏在细节中

答案 1 :(得分:6)

  

如果有的话,他们俩之间有什么区别? 如果新名称没有差异?

事实上,这是旧名称:for

如果你的意思是为什么C ++没有像其他语言那样在语言中添加新名称,例如foreach,那么你告诉我们为什么在添加名称的时候旧名称工作正常吗?


来自你的评论:

  

但据我所知,所有其他人都称这种语法为“for-each loop”。这个概念的新名称让我问是否确实存在比我能看到的更多的差异。

好的。它是关于术语: for-each-loop 基于范围的for-loop

我认为这是因为C ++基于范围的循环基本上迭代 std :: begin(c)定义的范围内的所有元素的std ::(c)结束。换句话说,名称​​基于范围的循环强调了定义范围beginend迭代器的原理。

为了进一步说明,基于范围的循环仅适用于定义了begin()end()的集合:

std::vector<int> v;
int a[100];
int *p = new int[100];

for(int i : v) {} // works :  begin(v) and end(v) are defined
for(int i : a) {} // works :  begin(a) and end(a) are defined
for(int i : p) {} // does not work :  begin(p) and end(p) are not defined

希望有所帮助。

答案 2 :(得分:-4)

这是一个标准的foreach实现 - 只是为了方便而添加了语法糖。