自定义数据结构的基于范围的for循环 range-based for loop
2016-07-01 22:18
369 查看
C++11中引入了基于范围的for 循环,原来需要写三个分句的for 循环现在只需要写一句就能搞定,而且有了auto 自动类型推导,再也不用写一大坨迭代器的类型。
C++11之前只能这么写:
但是对于内置的数组类型和标准库以外的自定义类型容器,怎样才能进行基于范围的for 循环操作呢?
一样的,观察C++03中最上边的例子,只要满足下边几个条件即可:
1、只要定义该容器相关的迭代器 //这里的迭代器是广义的迭代器,指针也属于该范畴。
2、该类型拥有begin() 和 end() 成员方法,返回值为迭代器(或者重载全局的begin() 和 end() 函数也可以) 。
3、迭代器支持 != 比较操作 。
4、迭代器支持++ 前置自增操作,显然该操作要是迭代器对象指向该容器的下一个元素 。
5、迭代器支持* 解引用操作,显然解引用操作必须容器对应元素的引用,否则引用遍历时将会出错。
基于范围的for 循环只是旧式的一种简洁写法,continue,break,return 语句的作用还是一样的。
C++11之前只能这么写:
std::vector<int> v{1, 2, 3, 4, 5}; for(std::vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter) { std::cout << *iter << " "; }C++11中,能这么写:
std::vector<int> v{1, 2, 3, 4, 5}; for(auto iter = v.begin(); iter != v.end(); ++iter) { std::cout << *iter << " "; }
但是对于内置的数组类型和标准库以外的自定义类型容器,怎样才能进行基于范围的for 循环操作呢?
一样的,观察C++03中最上边的例子,只要满足下边几个条件即可:
1、只要定义该容器相关的迭代器 //这里的迭代器是广义的迭代器,指针也属于该范畴。
2、该类型拥有begin() 和 end() 成员方法,返回值为迭代器(或者重载全局的begin() 和 end() 函数也可以) 。
3、迭代器支持 != 比较操作 。
4、迭代器支持++ 前置自增操作,显然该操作要是迭代器对象指向该容器的下一个元素 。
5、迭代器支持* 解引用操作,显然解引用操作必须容器对应元素的引用,否则引用遍历时将会出错。
template<typename T> class Myvector; //前置模板声明 template <typename T> class iterator { public: iterator(T* para, size_t n) { iter = para + n; } T& operator*() //返回类型为指向元素的引用 { return *iter; } bool operator!=(const iterator& that) { return this->iter != that.iter; } iterator& operator++() { ++iter; return *this; } private: T* iter; }; template<typename T> class Myvector { public: Myvector(size_t n) : size(n) { p = new T[size]; } iterator<T> begin() { return iterator<T>(this->p, 0); } iterator<T> end() { return iterator<T>(this->p, size); } void print() //print() 方法用来测试容器的元素 { for(auto i = 0; i < size; ++i) { std::cout << p[i] << " "; } std::cout << "\n"; } private: T* p; size_t size; }; //测试代码 int main() { Myvector<int> vec{6}; int it = 0; for(auto& i : vec) { i = ++it; } std::cout << "\n"; vec.print(); return 0; }
基于范围的for 循环只是旧式的一种简洁写法,continue,break,return 语句的作用还是一样的。
相关文章推荐
- 数据结构和算法 – 12.高级查找算法(下)
- 最短路径算法
- 【数据结构】平衡搜索树之---B树的算法实现
- 数据结构实验之链表一:顺序建立链表
- java数据结构-HashMap
- Redis(2)- 基本数据结构和操作
- Python内置数据结构与操作符的练习题集锦
- HDU 5289 RMQ+尺取
- 剑指offer(二.2)数据结构之数组2 面试题3
- 数据结构之【排序】--复习
- 海量数据处理-数据结构
- linux设备树的解释 - DT文件数据结构
- 《数据结构》复习之稀疏矩阵(矩阵转置)
- 数据结构与算法简记:快速排序
- 数据结构也不是那么没意思之前序二叉树+二叉树转伪双向循环链表
- 分组统计查询
- 企鹅厂试题(数据结构)
- 二叉树知识点、先序、中序、后序遍历(数据结构)
- 《数据结构》复习之线性表(栈和队列)
- 数据结构课程设计(运动会成绩管理系统)