5

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

如果有的话,他们两个有什么区别?如果没有差异,为什么要新名称?

编辑:为了澄清,我不是在寻找 c++ 的“基于范围”和其他语言的每个或 std::for_each 之间的实现差异。相反,我想知道他们决定将这个新的 c++“特性”(或语法、习语或任何你想称呼它的名称)称为“基于范围的 for 循环”而不是“for each”这一事实背后是否有一些隐藏的价值循环”,因为几乎所有其他人似乎都在调用这些东西。

4

3 回答 3

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 循环语法更简洁、更通用,但您不能在不同于 from begin()to的指定范围内执行循环中的代码end()
  • begin()通过定义和end()函数,可以将基于范围的 for 循环应用于没有定义迭代器的容器。

您无法将其与“广义的 for-each 成语”进行比较,因为没有标准的成语。要进行比较,您必须指出具体的实现,而差异通常隐藏在细节中

于 2012-04-17T11:16:44.700 回答
6

如果有的话,他们两个有什么区别?如果没有差异,为什么要新名称?

事实上,它是旧名称:for

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


从您的评论中:

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

好的。它是关于术语的:for-each-loop vs. range-based-for-loop

我认为这是因为 C++ 基于范围的循环基本上迭代了std::begin(c)std::end(c)定义的范围内的所有元素。换句话说,range-based-for-loop这个名字强调了定义range的哲学和迭代器。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

希望有帮助。

于 2012-04-17T11:19:35.067 回答
-3

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

于 2012-04-17T11:20:24.590 回答