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



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

如果有的话,它们之间有什么区别?如果没有区别,为什么使用新名称?

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

语法:

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 循环应用于未定义迭代器的容器。

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

如果有的话,它们之间有什么区别?如果没有区别,为什么使用新名称?

其实就是旧名:for

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


从您的评论中:

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

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

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

为了进一步解释这一点,基于范围的 for 循环仅适用于定义了 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

希望有帮助。

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

最新更新