C++的reverse_iterator实现及理解

目录

一、反向迭代器的实现

二、解引用的实现

三、迭代器的自加自减

四、判断符号重载

五、完整代码实现

 


一、反向迭代器的实现

用正向迭代器就可以封装出来一个反向迭代器,这也是体现了复用 

扫描二维码关注公众号,回复: 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;
		}

}

 

猜你喜欢

转载自blog.csdn.net/weixin_63246738/article/details/131890285
今日推荐