C++进阶——反向迭代器Reverse_iterator

C++进阶——反向迭代器Reverse_iterator

Reverse_iterator反向迭代器介绍

之前我们学过适配器,但是只实现了普通的迭代器,可是反向迭代器没有实现,当时说之后会实现的,没错就是今日,我们要收复Reverse_iterator-----stl-list
我们其实可以封装一个反向迭代器库(Reverse_iterator.h),这样不管是什么容器(适配器)都可以使用了,减少了代码的冗余。

反向迭代器的实现

底层实现

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

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)
		{}
		
	}

解引用的实现

这其实是利用了之前学过的list的思想,用一个Ref实现引用(可以是const对象,也可以是普通的对象),Ptr也一样可以是 const指针,也可以是普通指针。

		//template<class Iterator, class Ref, class Ptr>
		Ref operator*()
		{
			Iterator tmp = _it;
			return *--tmp;
		}
		Ptr operator->()//重中之重
		{
			
			return &(operator*());
		}

而且这里的 - > 还可以复用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;
		}

}

各个容器的实现

vector迭代器

vector迭代器的实现

// 正向迭代器
		typedef T* iterator;
		typedef const T* const_iterator;

	// 正向迭代器
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _finish;
		}

		const_iterator begin() const
		{
			return _start;
		}

		const_iterator end() const
		{
			return _finish;
		}

vector反向迭代器的实现
反向迭代器为了对称把正向迭代器的end当成了反向迭代器的rbegin;把正向迭代器的begin当成了反向迭代器的rend。

// 反向迭代器
		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());
		}

list迭代器

list迭代器的实现

// 正向迭代器
		typedef __list_iterator<T, T&, T*> iterator;
		typedef __list_iterator<T, const T&, const T*> const_iterator;

// 正向迭代器
		iterator begin()
		{
			return iterator(_head->_next);
		}
		iterator end()
		{
			return iterator(_head);
		}

		const_iterator begin() const
		{
			return const_iterator(_head->_next);
		}

		const_iterator end() const
		{
			return const_iterator(_head);
		}


list反向迭代器的实现
反向迭代器为了对称把正向迭代器的end当成了反向迭代器的rbegin;把正向迭代器的begin当成了反向迭代器的rend。

// 反向迭代器
		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());
		}

反向迭代器都是对正向迭代器的复用
反向迭代器------以下下代码可以粘贴到任意容器中,这样就可以一次性实现反向迭代器了

 反向迭代器------以下下代码可以粘贴到任意容器中,这样就可以一次性实现反向迭代器了
		//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());
		//}
	};
	// vector和list反向迭代器实现
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tom王要coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值