基于范围的for循环(C++11起)

来自cppreference.com
< cpp‎ | language
 
 
C++语言
表达式
替代表示
字面量
布尔型 - 整型 - 浮点型
字符型 - 字符串 - nullptr (C++11)
用户定义 (C++11)
Utilities
属性 (C++11)
Types
typedef声明
类型别名声明 (C++11)
Casts
隐式类型转换 - 显示类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
静态成员函数
模板
杂项
 

在一个范围内执行for循环。

在一个范围上,如一个容器类,用作一个相对于传统的for循环可读性更高的替代品。

目录

[编辑] 语法

attr(可选) for ( range_declaration : range_expression ) loop_statement
attr(C++11) - 任意多个属性
range_declaration - 变量声明,其类型为range_expression中元素的类型,或对其的引用。经常使用auto进行自动类型推导
range_expression - 任何可以表达一个合适的序列的的表达式(数组,定义了beginend成员函数或命名空间函数的对象,见下),或braced-init-list.
loop_statement - 任意语句,通常为一个复合语句,作为循环体

[编辑] 解释

上面的语法产生类似下面的代码(__range__begin__end仅用于说明功能):

{
auto && __range = range_expression ;
auto __begin = begin_expr(__range);
auto __end = end_expr(__range);
for (;__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}

}

range_expression求值以确定将被便利的序列或范围。序列中的每一个元素被解引用,并被赋值给具有range_declaration中指定的类型与名称的变量。

begin_exprend_expr的定义为:

  • 如果range_expression为数组类型,那么begin_expr__rangeend_expr(__range + __bound),其中__bound为数组中元素的个数。(如果数组元素个数未知或为不完整类型,那么程序是非法的)
  • 如果range_expression为类类型,并且该类有名为begin和/或end的成员,那么begin_expr__range.begin()end_expr__range.end()
  • 否则,begin_exprbegin(__range)end_exprend(__range),对函数名的查找将仅使用基于参数的名字查找

如果range_expression返回了一个临时变量,它被绑定到了右值引用__range上,其生命期将被延长至循环结束。但注意range_expression中的临时变量的生命期不会被延长。

与传统的循环一样,可以通过break语句提前退出循环,或使用continue语句开始下一个循环。

attr为若干可选的属性

[编辑] 关键字

for

[编辑] 示例

#include <iostream>
#include <vector>
 
int main() 
{
    std::vector<int> v = {0, 1, 2, 3, 4, 5};
 
    for(const int &i : v) // access by const reference
        std::cout << i << ' ';
    std::cout << '\n';
 
    for(auto i: v) // access by value, the type of i is int
        std::cout << i << ' ';
    std::cout << '\n';
 
    for(auto&& i: v) // access by reference, the type of i is int&
        std::cout << i << ' ';
    std::cout << '\n';
 
    for(int n: {0, 1, 2, 3, 4, 5}) // the initializer may be a braced-init-list
        std::cout << n << ' ';
    std::cout << '\n';
 
    int a[] = {0, 1, 2, 3, 4, 5};
    for(int n: a)  // the initializer may be an array
        std::cout << n << ' ';
    std::cout << '\n';
 
    for(int n: a)  
        std::cout << 1 << ' '; // the loop variable need not be used
    std::cout << '\n';
 
}

输出:

0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
1 1 1 1 1 1

[编辑] 另请参阅

将一个函数应用于某一范围的元素
(函数模板) [edit]