目录
一、反向迭代器
二、反向迭代器的实现
一、反向迭代器
之前的模拟实现vector、list 的时候,这些都是实现了正向迭代器,反向迭代器都没有实现,这里就要实现反向迭代器
反向迭代器也是适配器(配接器)的一种,反向迭代器的实现是对正向迭代器的封装,即实现的反向迭代器能支持多种容器,给出该容器的正向迭代器就能支持反向迭代器
比如 vector 需要反向迭代器,那就把 vector 的正向迭代器传给 反向迭代器,它就可以通过正向迭代器转换出 vector 的反向迭代器。
也就是说,实现的反向迭代器并包装的这个类,不是针对某个容器而是针对所有容器的,任何一个容器只要你实现了正向迭代器,就可以通过其适配出反向迭代器
要注意反向迭代器的错位访问
对于 list 而言,正向迭代器的 begin 和 end 位置如下

begin 位于头结点的下一个节点,end 则位于尾结点的下一个节点,即头节点,正向迭代器 ++ 操作,迭代器是往后走的

反向迭代器 rbegin 和 rend 位置如下

反向迭代器 rbegin() 位于正向迭代器 end() 的位置, 反向迭代器 rend() 位于正向迭代器 begin() 的位置,反向迭代器 ++操作迭代器是往前走的

vector 反向迭代器也是如此
对于 list 来说,反向迭代器解引用取数据,取的是头节点上一个节点位置的数据,vector 也是如此
二、反向迭代器的实现
Iterator.h
#pragma once
template<class Iterator, class Ref, class Ptr>
class ReverseIterator
{
	typedef ReverseIterator<Iterator, Ref, Ptr> Self;
public:
	ReverseIterator(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;
	}
	
private:
	Iterator _it;
};
 
下面套到 list 里面进行测试
//反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator; 

在 list 里面添加反向迭代器代码
reverse_iterator rbegin()
{
	return reverse_iterator(end());
}
reverse_iterator rend()
{
	return reverse_iterator(begin());
} 
测试代码
void Test_ReverseIterator()
{
	fy::list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	fy::list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	fy::list<int>::reverse_iterator rit = lt.rbegin();
	while (rit != lt.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
} 
运行结果

list 的反向迭代器就完成了,下面测试 vector 的反向迭代器
把 Iterotor.h 拷贝一份到 vector 里面
//反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator; 

在 vector 里面添加反向迭代器代码
reverse_iterator rbegin()
{
	return reverse_iterator(end());
}
reverse_iterator rend()
{
	return reverse_iterator(begin());
} 
测试代码
void Test_ReverseIterator()
{
	fy::vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	v.push_back(6);
	fy::vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//反向迭代器
	fy::vector<int>::reverse_iterator rit = v.rbegin();
	while (rit != v.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
} 
运行结果

----------------我是分割线---------------
文章到这里就结束了,下一篇即将更新




![学习open62541 --- [74] 软链接的妙用](https://img-blog.csdnimg.cn/aac2ed0438e0412d9f51ab52197b2627.png#pic_left)






![[SSD固态硬盘技术 0] SSD的结构和原理导论](https://img-blog.csdnimg.cn/img_convert/149265d1ca124478a13b89583dcb51a0.webp?x-oss-process=image/format,png)

![[LeetCode 1138]字母板上的路径](https://img-blog.csdnimg.cn/107e2cfdb4ac4bbcab58938efa82fe10.png)





