C++反向迭代器
反向迭代器是用正向迭代器适配实现的,本质是写一个反向迭代器的类模板,给编译器传不同的容器的正向迭代器实例化,编译器去实例化出各种类模板对应的反向迭代器。
#pragma once
namespace my_reverse_iterator
{
template<class Iterator, class Ref , class Ptr>
struct ReveraseIteraotr
{
typedef ReverseIteraotr<Iterator, Ref, Ptr> Self;
Iterator _it;
ReveraseIteraotr(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;
}
bool operator!=(const Self& s)
{
return _it != s._it;
}
};
}
operator*
中不直接--_it
的原因是:迭代器是用来访问的,不应该在内部对它进行更改,所以需要一个临时变量。
反向迭代器和正向迭代器的起始位置和结束位置是对称的,正向迭代器的end是指向最后一个元素的下一个位置(即尾插的位置),那么反向迭代器的rend指向的是第一个元素的前一个位置(即头插的位置)。所以operator*
的重载中,返回的是--
的位置的元素。