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

来源:互联网 发布:高仿古驰男鞋淘宝店 编辑:程序博客网 时间:2024/04/28 14:39

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


1 0