反向迭代器的底层


1.迭代器分类

迭代器按照定义方式分成以下四种。

  1. 正向迭代器,定义方法如下:

容器类名::iterator 迭代器名;

  1. 常量正向迭代器,定义方法如下:

容器类名::const_iterator 迭代器名;

  1. 反向迭代器,定义方法如下:

容器类名::reverse_iterator 迭代器名;

  1. 常量反向迭代器,定义方法如下:

容器类名::const_reverse_iterator 迭代器名;

2.迭代器使用

在这里插入图片描述

3.模拟实现迭代器

3.1 各个类的迭代器

在这里插入图片描述

在这里插入图片描述

3.2 所有容器的迭代器(迭代器适配器)

在这里插入图片描述

// 所有容器的反向迭代器
// 迭代器适配器
namespace bit
{
	// vector<T>::iterator ->
	// list<T>::iterator   ->
	template<class Iterator, class Ref, class Ptr>
	struct ReverseIterator
	{
		typedef ReverseIterator<Iterator, Ref, Ptr> Self;
		Iterator _it;//正向迭代器用一个节点的指针构造
		ReverseIterator(Iterator it)//反向迭代器封装一个正向迭代器
			:_it(it)
		{}

		Ref operator*()
		{
			Iterator tmp = _it;
			return *(--tmp);
		}

		Ptr operator->()
		{
			//return _it->;
			//return _it.operator->();

			return &(operator*());
		}

		Self& operator++()//反向迭代器的++是正向迭代器的--
		{
			--_it;
			return *this;
		}

		Self& operator--()//同上
		{
			++_it;
			return *this;
		}

		bool operator!=(const Self& s)
		{
			return _it != s._it;
		}
	};

	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
		{
			// list_node<int>*
			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;
		}
	};

	template<class T>
	class list
	{
		typedef list_node<T> Node;
	public:
		typedef __list_iterator<T, T&, T*> iterator;
		typedef __list_iterator<T, const T&, 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_iterator begin() const
		{
			// list_node<int>*
			return const_iterator(_head->_next);
		}

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

		iterator begin()
		{
			return iterator(_head->_next);
			//return _head->_next;
		}

		iterator end()
		{
			return iterator(_head);
		}

		const_reverse_iterator rbegin() const
		{
			// list_node<int>*
			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:表示要适配的容器的迭代器类型。
②Ref:表示返回值的引用类型,通常是迭代器指向元素的引用类型。
③Ptr:表示返回值的指针类型,通常是迭代器指向元素的指针类型。
因此,只要你有一个满足上述条件的迭代器,这个适配器就可以适配你的容器。比如,你可以将这个适配器用于std::vector、std::list等STL容器的迭代器,甚至可以用于你自己实现的容器的迭代器(只要满足上述条件)。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chris·Bosh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值