//效果每次迭代器加移动两格
#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;
}
效果: