for (const auto &s : strs)
是什么意思?冒号:
的功能是什么?
vector<string> &strs;
for (const auto &s : strs){
//
}
答案 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-expr
和end-expr
的名称查询有一些条件,但所有标准库容器(例如您的std::vector
),std::initializer_list
,原始数组以及任何
begin()
和end()
函数。
:
只是将循环内部使用的声明与循环表达式的声明分开的语法。