C++ 自定义迭代器(实现++递增两格)

来源:互联网 发布:淘宝客服外包价格 编辑:程序博客网 时间:2024/05/29 16:53

//效果每次迭代器加移动两格

#pragma once//MyIterator.h#include <iterator>#include <exception>template<typename Container>class MyIterator :public std::iterator<std::random_access_iterator_tag, typename Container::value_type>{protected:    Container& container;    typename Container::iterator pos;public:    explicit MyIterator(Container& c) :container(c), pos(c.begin()){}    MyIterator(const MyIterator& rhs) :container(rhs.container),pos(rhs.pos) {}    MyIterator& operator =(const MyIterator& rhs)    {        throw_ex(rhs.container);        pos = rhs.pos;        return *this;    }    //--等就省略了...    MyIterator& operator ++()    {        auto tmp = container.end() - 1;        if (pos == tmp)            ++pos;        else            pos += 2;        return *this;    }    bool operator ==(const MyIterator& rhs)const    {        try        {            if (&rhs.container == &container)                return pos == rhs.pos;            else            {                throw exception("对象错误");            }        }            catch (exception &e)            {                cout << e.what();                exit(EXIT_FAILURE);            }        }bool operator !=(const MyIterator& rhs)const{    return !(*this == rhs);}typename Container::value_type & operator *(){            return *pos;}void begin(){    pos = container.begin();}void end(){    pos = container.end();}private:    void throw_ex(const Container& c)    {        try        {            if (&c == &container)                return;            else                throw exception("Copy 构造失败");        }        catch (exception &e)        {            cout << e.what();            exit(EXIT_FAILURE);        }    }};//无法使用或添加vector<T> vec 成员函数vec.begin()或全局函数begin(vec)//我们做个假冒的全局函数 start(vec) over(vec)template<typename Container>MyIterator<Container> start(Container& c){        MyIterator<Container> mi(c);        mi.begin();        return mi;}template<typename Container>MyIterator<Container> over(Container & c){        MyIterator<Container> mi(c);        mi.end();        return mi;}

//main.cpp

#include <iostream>#include <vector>#include "MyIterator.h"#include <list>using namespace std;//因继承了iterator<std::random_access_iterator_tag,Container::value_type>才拥有此特性template<typename Iterator>void printIterator(const Iterator &It){    cout << typeid(typename iterator_traits<Iterator>::iterator_category).name() << endl;}int main(){    vector<int> coll{ 1,2,3,4,5,6,7,8,9,10 };    MyIterator<decltype(coll)> myit(coll);    printIterator(myit);    for (; myit != over(coll); ++myit)    {        cout << *myit << ends;    }    system("pause");    return 0;}

效果:
这里写图片描述

原创粉丝点击