【C++11新特性】range-based-for基于范围的for循环

网站分享:https://cppinsights.io/

在网站中输入C++代码片段,它会展示编译器在编译过程中对代码所做的各种转换和优化

一、分析

 range-based-for模板源代码:

    for(auto &elem:v){
        
    }

经过编译器转换后的代码:

{
    M_vector<int> & __range1 = v;
    int * __begin1 = __range1.begin();
    int * __end1 = __range1.end();
    for(; __begin1 != __end1; ++__begin1) {
      int & elem = *__begin1;
    }
    
}

range-based-for的底层代码中先对遍历对象引用,取别名为__range1,然后调用__range1对象的begin和end方法,最后在for循环中遍历。

从上述代码可以看出,自定义类想要支持range-based-for必须满足以下条件:

  • 自定义类支持begin()和end()方法返回迭代器
  • 该迭代器支持!=运算符和前置++运算符的重载

二、自定义M_vector类实现支持range-based-for

由于该迭代器是T类的的指针,本身支持!=运算符和前置++运算符,所以只需实现begin和end即可。

template <class T>
class M_vector
{
    // 成员函数
public:
    using iterator = T *;
    iterator begin()
    {
        return _start;
    }
    iterator end()
    {
        return _finish;
    }
    M_vector();
    ~M_vector();

    void push_back(const T &value);
    void pop_back();

    int size() const;
    int capacity() const;

private:
    void reallocate(); // 重新分配空间

    // 成员变量
private:
    static allocator<T> _alloc;

    T *_start;
    T *_finish;
    T *_end_of_storage;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值