目录
一、反向迭代器的实现
用正向迭代器就可以封装出来一个反向迭代器,这也是体现了复用
扫描二维码关注公众号,回复:
17048551 查看本文章
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
typedef Reverse_iterator<Iterator, Ref, Ptr> self;
Iterator _it;
Reverse_iterator(Iterator it)
:_it(it)
{}
}
二、解引用的实现
//template<class Iterator, class Ref, class Ptr>
Ref operator*()
{
Iterator tmp = _it;
return *--tmp;
}
Ptr operator->()//重中之重
{
return &(operator*());
}
三、迭代器的自加自减
反向迭代器的 + 就是正向迭代器的 - 所以只要函数重载就可以了
//前置
self& operator++()
{
--_it;
return *this;
}
self& operator--()
{
++_it;
return *this;
}
//后置
self operator++(int)
{
self tmp = *this;
--_it;
return tmp;
}
self operator--(int)
{
self tmp = *this;
++_it;
return tmp;
}
四、判断符号重载
迭代器不需要比较大小,只需要比较等于和不等于
比较的还是迭代器(地址)
bool operator!=(const self& s)
{
return _it != s._it;
}
bool operator==(const self& s)
{
return _it == s._it;
}
五、完整代码实现
#pragma once
namespace tom
{
// 适配器 -- 复用
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
typedef Reverse_iterator<Iterator, Ref, Ptr> self;
Iterator _it;
Reverse_iterator(Iterator it)
:_it(it)
{
}
Ref operator*()
{
Iterator tmp = _it;
return *--tmp;
}
Ptr operator->()//重中之重
{
return &(operator*());
}
//前置
self& operator++()
{
--_it;
return *this;
}
self& operator--()
{
++_it;
return *this;
}
//后置
self operator++(int)
{
self tmp = *this;
--_it;
return tmp;
}
self operator--(int)
{
self tmp = *this;
++_it;
return tmp;
}
bool operator!=(const self& s)
{
return _it != s._it;
}
bool operator==(const self& s)
{
return _it == s._it;
}
}