自定义数据结构的基于范围的for循环 range-based for loop

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 语句的作用还是一样的。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值