博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义for循环
阅读量:3957 次
发布时间:2019-05-24

本文共 1756 字,大约阅读时间需要 5 分钟。

首先,这里说的for循环,是指C++中新增的for(a : b)格式的for循环。

最近碰到了这样的问题,就来记录一下。如有错漏,还望指摘。

C++新增的这种for循环,使用来遍历容器中的每一个元素。但是有时候,我想自定义自己的容器,那能不能也使用这样的for循环呢?

答案肯定是可以的。那么需要什么要求呢?

for循环的大致逻辑

要向弄明白有什么需求,我们首先需要弄明白,这个for循环是怎么实现的。

比如对于for(ele : list), 其实大致相当于如下代码:

for(auto it = list.begin(); it != list.end(); ++it){
ele = *it; // ......}

自定义for循环要求

那么我们就可以看出对于格式为for(ele : list)的for循环语句,有如下要求

  1. 变量list对应的类型中必须包含begin()函数
  2. 变量list对应的类型中必须包含end()函数
  3. begin()函数的返回值类型中,必须实现了++操作符
  4. begin()函数的返回值类型中,必须实现了*操作符
  5. begin()函数的返回值类型中,必须实现了参数类型为end()函数返回值类型的!=操作符。

实现

所以如下代码就可以实现自定义for循环:

class ArrayEnd{
public: int* ptr_; ArrayEnd(int* ptr) : ptr_(ptr) {
}};class ArrayBegin{
private: int* ptr_;public: ArrayBegin(int* ptr) : ptr_(ptr) {
} ArrayBegin& operator++() {
ptr_++; return *this; } int& operator *() {
return *ptr_; } bool operator != (const ArrayEnd& e) {
return ptr_ != e.ptr_; }};class myArray{
private: int* ptr_; int len_;public: myArray(int* ptr, int len) : ptr_(ptr), len_(len) {
} ArrayBegin begin() {
return ArrayBegin(ptr_); } ArrayEnd end() {
return ArrayEnd(ptr_ + len_); }};

不过当然,一般我们会将ArrayBegin和ArrayEnd合并在一起成为ArrayIterator:

class ArrayIterator{
private: int* ptr_;public: ArrayIterator(int* ptr) : ptr_(ptr) {
} ArrayIterator& operator++() {
ptr_++; return *this; } int& operator *() {
return *ptr_; } bool operator != (const ArrayIterator& e) {
return ptr_ != e.ptr_; }};class myArray{
private: int* ptr_; int len_;public: myArray(int* ptr, int len) : ptr_(ptr), len_(len) {
} ArrayIterator begin() {
return ArrayIterator(ptr_); } ArrayIterator end() {
return ArrayIterator(ptr_ + len_); }};

转载地址:http://wxxzi.baihongyu.com/

你可能感兴趣的文章
同时装了Python3和Python2,怎么用pip?
查看>>
linux tar 解压缩zip文件报错的解决
查看>>
vim,ctag和Taglist
查看>>
Ubuntu的apt命令详解
查看>>
Ubuntu Server 设置sshd
查看>>
sort,uniq命令的使用。
查看>>
linux下md5加密(使用openssl库C实现)
查看>>
openssl、MD5的linux安装方法
查看>>
DevC++ 工程没有调试信息的解决办法
查看>>
http消息长度的确定
查看>>
手机和电脑如何连接蓝牙
查看>>
HTTP协议参数
查看>>
wireshark检索命令
查看>>
五人分鱼问题(附答案)
查看>>
linux查看文件有多少行
查看>>
error:previous declartion of "XXX" is here的解决方法
查看>>
sha1的几个函数的使用
查看>>
为什么int型的数组用memset不能清零(memset的使用规范)
查看>>
<转>CRC校验、MD5、SHA1算法的概念和可靠性现状
查看>>
linux杀死进程详解
查看>>