自定义数据结构的基于范围的for循环 range-based for loop
来源:互联网 发布:高仿古驰男鞋淘宝店 编辑:程序博客网 时间:2024/04/28 14:39
C++11中引入了基于范围的for 循环,原来需要写三个分句的for 循环现在只需要写一句就能搞定,而且有了auto 自动类型推导,再也不用写一大坨迭代器的类型。
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 语句的作用还是一样的。
1 0
- 自定义数据结构的基于范围的for循环 range-based for loop
- Modern C++(二)Range-based for loop(基于范围的for循环)
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
- C++11新特性:range based for loop-范围for循环基本使用方法
- range-based for() loop
- Range based for loop
- C++11新特性之基本范围的For循环(range-based-for)
- for循环,迭代器,range范围的操作方法
- 基于范围的for循环
- 基于范围的for循环
- C++ 基于范围的for循环
- c++ 11 基于范围的for循环
- (七十六)基于范围的for循环
- C++11 基于范围的for循环
- 基于范围的for循环(C++11)
- c++11 : range-based for loop
- C++11 | range-based for loop
- C++11中的有趣的新特性(constexpr ) (Range-based for loop)
- Oracle -- 索引
- pdf2swf 转换时报错
- Servlet 转发实例
- UIView——手势
- 通过Web浏览并控制Tiny6410上的摄像头
- 自定义数据结构的基于范围的for循环 range-based for loop
- it工程师常用英文自我介绍常用用语
- Spring Schedule 任务调度实现
- 广播--的有序和无序
- C#目录操作 Path类与Directory类
- 树叶叶脉的提取及描述
- SpringMVC访问静态资源的三种方式
- 利用selenium 实现对百度图片搜索中的图片的抓取
- 在 Ubuntu 14.04 上编译 llvm 和 clang 3.8