C++11之for 新解(2)

来源:互联网 发布:c语言怎么ab之间求素数 编辑:程序博客网 时间:2024/05/19 17:08
前记

     C++提供了for range功能,如果自定义的类也想使用for range需要满足什么条件呢,通过观察和查阅资料,推理编译器编译后的结果和正常for循环的结果应给是一样的,正常for循环需要满足四个条件。

    for(auto it = vec_int.begin(); it!= vec_int.end(); ++it) {        cout << *it << "\t";    }

测试后for range也需要满足这四个条件:

     1、实现begin()
     2 、实现end()
     3 、实现 operator++()
     4 、实现 operator!=(class& other)
     
例子
#include <iostream>#include <assert.h>using namespace std;class VecInt;class Iter{public:    Iter(VecInt* pVectInt, int pos) :   pVecInt_(pVectInt),                                        pos_(pos)    {    }    const Iter& operator++() {        ++pos_;        return *this;    }    bool operator!=(Iter other) {        return other.pos_ != pos_;    }    int operator*();private:    VecInt* pVecInt_;    int pos_;};class VecInt{public:    VecInt() {        index_ = 0;        max_ = 1;        data_ = new int[max_]();    }    ~VecInt() {        if(max_ > 0) {            delete []data_;            max_ = 0;            index_ = 0;        }    }    int get(size_t pos) {        assert(pos >= 0 && pos <= index_);        return data_[pos];    }    void realloc() {        max_ = max_ * 2;        int* temp = new int[max_]();        for(size_t i = 0; i < index_; ++i) {            temp[i] = data_[i];        }        delete []data_;        data_ = temp;    }    Iter begin() {        return Iter(this, 0);    }    Iter end() {        return Iter(this, index_);    }    void push_back(int value) {        if(index_ >= max_) {            realloc();        }        data_[index_] = value;        index_ = index_ + 1;    }private:    size_t max_;            // the int array length    size_t index_;          // current array index    int* data_;             // the int array pointer};// use the VecInt member function so define after the// VecInt define the functionint Iter::operator*() {    return pVecInt_->get(pos_);}int main() {    VecInt vec_int;    for(auto i = 1; i < 10; ++i) {        vec_int.push_back(i);    }    for(auto it : vec_int) {        cout << it << "\t";    }    cout << endl;}
程序很简单,实现了一个动态数组类, 和数组迭代器,在稍微比较难的地方,做了简单的注释,enjoy the code。
后记
     在学习过程中总是感觉一开始都懂了,但过了一段时间后还是忘记了。或者给别人描述的时候说不清楚。为啥是这样,我想有这么几个原因:
     1、从小受到填鸭式的教育,重记忆,所以每次只是记住了,并没理解
     2、学习后,过了很长时间忘记了
     3、记忆力不行
     如何解决这种学了就忘了得问题呢?有人提出三个境界,what,how, why。如果想真正的掌握这些知识,需要付出更多的精力去了解这东西为啥这样用,发明这些知识的作者当时是如何想得,自己通过已知的知识,是否能推导出相应的一种模式。通过这种方式的理解,相信学习知识的效率更高。
1 0
原创粉丝点击