“for(const auto& s:strs){}”是什么意思?

时间:2014-03-06 12:52:34

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

for (const auto &s : strs)是什么意思?冒号:的功能是什么?

vector<string> &strs;
for (const auto &s : strs){
   //
}

2 个答案:

答案 0 :(得分:8)

它实际上是一个名为“基于范围的for-loops”的C ++ 11特性。

在这种情况下,它基本上是一个更易于编写的替代品:

// Let's assume this vector is not empty.
vector<string> strs;

const vector<string>::iterator end_it = strs.end();

for (vector<string>::iterator it = strs.begin(); it != end_it; ++it) {
  const string& s = *it;
  // Some code here...
}

:new syntax的一部分。

在左边,你基本上有一个变量声明,它将绑定到向量的元素,右边有一个变量可以迭代(也称为“范围表达式”)。

以下是链接文档的摘录,它解释了范围表达式的先决条件:

  

评估range_expression以确定要迭代的序列或范围。反过来,序列的每个元素都被解除引用并分配给变量,其范围和名称在range_declaration中给出。

     

begin_expr和end_expr定义如下:

     

如果__range是一个数组,那么begin_expr是__range而end_expr是(__range + __bound),其中__bound是数组中元素的数量(如果数组大小未知或类型不完整,程序生病了-formed)

     

如果__range的类型是具有开始或结束成员函数之一或两者的类类型,则begin_expr是__range.begin(),end_expr是__range.end();

     

否则,begin_expr是begin(__ range),end_expr是end(__ range),它们是通过参数依赖的查找找到的,std是一个关联的命名空间。

请注意,由于所有这些,基于范围的for循环也支持迭代C数组,因为std::begin / std::end也可以使用。

答案 1 :(得分:3)

根据 6.5.4基于范围的声明[stmt.ranged] 声明

for ( for-range-declaration : expression ) statement

相当于

{
    auto && __range = range-init;
    for (auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
       for-range-declaration = *__begin;
       statement
    }
}

换句话说,编译器会将其扩展为从表达式的begin()end()开始的常规for循环。

begin-exprend-expr的名称查询有一些条件,但所有标准库容器(例如您的std::vector),std::initializer_list,原始数组以及任何

将接受正确命名空间中的成员或非成员begin()end()函数。

:只是将循环内部使用的声明与循环表达式的声明分开的语法。