自定义for循环

首先,这里说的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_); }
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值