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

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

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

如果有的话,两者之间有什么区别?如果没有差异,为什么要使用新名称?

编辑:澄清一下,我不是在寻找 c++ 的“基于范围的”与其他语言的 for each 或 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-each 习语”相提并论,因为没有标准的习语。要比较,您必须指出具体实现,差异通常隐藏在细节中

关于c++ - 基于范围的循环与 for-each 循环有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10190045/

相关文章:

c++ - 删除没有指定大小的指针数组

c++ - 了解堆上保留内存的大小

python - 如何在Python中根据多个其他列表过滤列表?

c++ - 为什么 std::cout 如此耗时?

c++ - 让函数在不指定模板参数的情况下获取指向模板对象的指针

c++ - 访问类中的几个容器

c++ - "Merge" vector 指针

c# - 当缺少所有表达式时,C# for 循环会做什么。例如 (;;) {}

Java for循环生成MAC地址

c++ - MongoDB C++ 驱动程序 3.0 以字符串形式获取文档并避免使用 json