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

来自cppreference.com
< cpp‎ | language
 
 
C++语言

|- class="t-nv-h1" | colspan="5" | 一般主题 |- | |- |

预处理器
注释

|

|-

|- class="t-nv-h1" | colspan="5" | 流程控制 |-

条件执行语句

| |- |

|

|-

循环语句

| |- |

for
用于范围的for (C++11)

|

|-

跳转语句

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 函数 |-

函数声明 Lambda函数声明 inline说明符 异常说明符 (已弃用) noexcept说明符 (C++11)

|- class="t-nv-h1" | colspan="5" | Exceptions |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 命名空间 |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类型 |- | |- |

|

|-

说明符

| |- |

decltype (C++11)
auto (C++11)
alignas (C++11)

|

|-

存储持续期说明符 Initialization

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 表达式 |- | |- |

值类别
求值顺序

|

|-

替代表示 字面量 布尔型 - 整型 - 浮点型 字符型 - 字符串 - nullptr (C++11) 用户定义 (C++11)

|- class="t-nv-h1" | colspan="5" | Utilities |-

属性 (C++11) Types typedef声明 类型别名声明 (C++11) Casts 隐式类型转换 - 显示类型转换 static_cast - dynamic_cast const_cast - reinterpret_cast 内存分配

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类 |- | |- |

|

|-

类特有的函数属性

| |- |

|

explicit (C++11)
static

|-

静态成员函数

| |- |

|

|- |- class="t-nv-h1" | colspan="5" | 模板 |- | |- |

|

|- |- class="t-nv-h1" | colspan="5" | 杂项 |- | |- |

|

|-

 

在一个范围内执行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返回了一个临时变量,它被绑定到了右值引用__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]
来自“http://zh.cppreference.com/mwiki/index.php?title=cpp/language/range-for&oldid=38896