目录
前言
一、反向迭代器接口(用户层)
二、模拟实现
三、以vector模拟实现为例
四、总结
前言
在vector和list的接口中我们实际上有说明过反向迭代器的用法,这里就有个问题,并不是只有这两个容器存在反向迭代器的。那么对于他们底层的实现我们是不是每个容器都写一个反向迭代器?
其实不是的,实际上不管你是什么容器,每个容器的反向迭代器实现的逻辑都大差不差,每一个容器都实现一段几乎相同的代码,多少有点费时费力,所以在STL库里就实现了一个适合所有具有迭代器的容器的反向迭代器!也就是迭代器适配器(和stack、queue一样的概念),你传入什么容器的正向迭代器,编译器就会适配出什么样的反向迭代器,本质是对正向迭代器的一种封装!!!!
一、反向迭代器接口(用户层)
这里在复习一下两个接口:
rbegin()+rend()
rbegin():返回最后一个元素的反向迭代器,即正向迭代器end的前一个位置。
rend():返回第一个元素之前理论元素的反向迭代器,即正向迭代器begin的前一个位置。
从上面的叙述中不难猜测出:对反向迭代器的++,实际上就是对正向迭代器的--!!
二、模拟实现
有了前面的铺垫这里直接上代码!!注意:这里的模板参数在和list的迭代器类是一样的
namespace Re
{
	// 适配器 -- 复用
	template<class Iterator, class Ref, class Ptr>
	class Reverse_iterator
	{
	public:
		typedef Reverse_iterator<Iterator, Ref, Ptr> self;
		Reverse_iterator(Iterator it)
			:_it(it)
		{}
		//*it
		Ref operator*()
		{
			Iterator tmp = _it;
			return *(--tmp);
		}
		//it->
		Ptr operator->()
		{
            //复用解引用
			return &(operator*());
		}
		//++it
		self& operator++()
		{
			--_it;//实际上这里调用正向迭代器,即:--end
			return *this;
		}
        //--it
		self& operator--()
		{
			++_it;
			return *this;
		}
        //it++ ,后置,先返回+之前的结果,所以要返回临时变量,不能引用接收   
        self operator++(int)
		{
			Iterator tmp=_it;
            --_it;
            return tmp;
		}
		self operator--(int)
		{
            Iterator tmp=_it;
			++_it;
			return tmp;
		}
		bool operator!=(const self& s)
		{
			return _it != s._it;
		}
        bool operator==(const self& s)
		{
			return _it == s._it;
		}
	private:
		Iterator _it;
	};
} 
值得一提的是:它的解引用操作实际上是对前一个位置进行解引用,而不是对当前位置进行解引用!!为啥呢?其实STL库里面它真正的底层实现结构是这样的:

每个容器的反向迭代器的构造,都是采用正向迭代器的end()进行构造适配,这么做只是为形成对称结构!!!只不过在用户层,看到的是上面的那两个接口那样:rbegin返回的是最后一个元素的反向迭代器,rend返回的是第一个元素的前一个理论元素的反向迭代器!这实际上也符合迭代器存在的目的:不关心底层具体实现结构,能够采用一种统一的方式去对容器中的数据进行访问!
三、以vector模拟实现为例
这里补充它的迭代器的完整实现,list也是类似的写法,因为上面的模拟实现的反向迭代器是适合所有容器的反向迭代器,只要你有正向迭代器,传进来就能适配!!
namespace Ve
{
    template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		// 反向迭代器适配支持
	typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
    typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;          
		const_reverse_iterator rbegin() const
		{
			
			return const_reverse_iterator(end());
		}
		const_reverse_iterator rend() const
		{
			return const_reverse_iterator(begin());
		}
		reverse_iterator rbegin()
		{
			return reverse_iterator(end());
		}
		reverse_iterator rend()
		{
			return reverse_iterator(begin());
		}
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _finish;
		}
		const_iterator begin() const
		{
			return _start;
		}
		const_iterator end() const
		{
			return _finish;
		}
        // ...
    }
} 
四、总结
①反向迭代器实际上是一个适配器,也叫迭代器适配器,适合所有容器。它实际上都是在调用对应的正向迭代器进行操作,反向的++,就是调用正向的--!
②反向迭代器本质就是对正向迭代器的一种封装!
希望今天的内容对你有帮助,感谢你的观看!!




















