C++11新特性——range for
来源:互联网 发布:孤岛危机3 优化 编辑:程序博客网 时间:2024/06/07 08:18
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中。range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作。
1.基本语法
for(declaration:expression) statement
其中,declaration定义一个变量,该变量将被用于访问序列中的基础元素,每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。expression是一个对象,用于表示一个序列。statement是对序列中元素的操作。
2.示例
vector<int> vec{1,2,3}; //C++11 only,大括号初始化 for (int i : vec ) cout << i;
上面的操作时将vector数组中的元素拷贝至变量i中,进行输出。如果想改变vector数组中的元素值,需要把循环变量i定义成引用类型,实现如下:
vector<int> vec{1,2,3}; //C++11 only,大括号初始化 for (auto& i : vec ){ i=i*i; cout << i;}//输出结果:149
请注意,我们依然可以用continue语句来开始下一次迭代,使用break跳出循环,这一点和普通的for循环一样。
3.深入分析
range for语句实际上等价于如下语句:
{ auto && __range = expression ; for (auto __begin = begin_expr, __end = end_expr;__begin != __end; ++__begin) { declaration = *__begin; loop_statement } }
请注意,“等价于”并不表示编译器就是这么实现range for,只是说两者的运行效果等价。其中expression是被迭代的对象, begin_expr与end_expr是迭代对象的迭代器,取值有:
(1)对于数组类型 begin_expr和end_expr分别等于__range
和__range + __bound
;
(2)对于STL中的容器,两者分别等于__range.begin()
和__range.end()
;
(3)对于其他类型,两者分别等于begin(__range)
和end(__range)
。编译器将会通过参数类型来找到合适的begin和end函数。
4.让自定义的类可以迭代
通过range for的等价语句可以看出,只要符合一定要求,自己定义的类也可以放在其中进行迭代。事实上要想进行迭代,一个类需要满足以下条件:
(1)拥有begin和end函数,返回值是一个可以自己定义的迭代器,分别指向第一个元素和最后一个元素。既可以是成员函数,也可以是非成员函数。
(2)迭代器本身支持*、++、!=运算符,既可以是成员函数,也可以是非成员函数。
示例如下:
#include <stdlib.h>#include <iostream> using namespace std;class IntVector{ //迭代器类 class Iter{ public: Iter(IntVector* p_vec, int pos):_pos(pos),_p_vec(p_vec){} // these three methods form the basis of an iterator for use with range for bool operator!= (const Iter& other) const{ return _pos != other._pos; } // this method must be defined after the definition of IntVector,since it needs to use it int& operator*() const{ return _p_vec->get(_pos); } const Iter& operator++ (){ ++_pos; return *this; } private: IntVector *_p_vec; int _pos; };public: IntVector(){} Iter begin(){ return Iter(this,0); } Iter end(){ return Iter(this, 20); } int& get(int col){ return data[col]; } void set(int index, int val){ data[index] = val; }private: int data[20] = {0};};int main() { IntVector v; for (int i = 0; i < 20; i++){ v.set(i, i); } for (int& i : v) { i = i*i; cout << i <<" "; } system("pause");}
程序输出结果:
0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361
参考资料
[1]C++ Primer中文版(第5版)
[2]Range-based for loop (since C++11)
[3]C++11 新特性之Range-based for loops
- C++11新特性——range for
- C++11 新特性之Range-based for loops
- C++11新特性:range based for loop-范围for循环基本使用方法
- C++11新特性之基本范围的For循环(range-based-for)
- C++11中的有趣的新特性(constexpr ) (Range-based for loop)
- C+11 新特性
- html/css标签学习,持续Mark——iframe与<input>新特性range
- [C++]C++11新特性
- 【C++】 C++11新特性
- Java 5 新特性——增强for循环
- Oracle 11g 新特性—— Active Database Duplication for A standby database
- c++11 特性 for新用法
- C++11的for循环新特性
- c++11新特性for循环
- H5—新特性
- ORACLE 12C新特性——CDB与PDB
- ORACLE 12C新特性——CDB与PDB
- ORACLE 12C新特性——CDB与PDB
- Java 类集框架
- Javascript闭包
- php中的命名空间
- CPU、内存、硬盘、指令
- poj1113(凸包)
- C++11新特性——range for
- Linux c 用栈和队列实现的停车场管理系统
- GC 算法
- Linux~连接windows的ftp,unzip出现的问题
- java bean 规范
- 食物链
- Java基础语法之数组
- 206. Reverse Linked List
- C#窗体程序的退出