【C++】-------反向迭代器的模拟实现(补充)

目录

前言

一、反向迭代器接口(用户层)

二、模拟实现

三、以vector模拟实现为例

四、总结


前言

vectorlist的接口中我们实际上有说明过反向迭代器的用法,这里就有个问题,并不是只有这两个容器存在反向迭代器的。那么对于他们底层的实现我们是不是每个容器都写一个反向迭代器?

其实不是的,实际上不管你是什么容器,每个容器的反向迭代器实现的逻辑都大差不差,每一个容器都实现一段几乎相同的代码,多少有点费时费力,所以在STL库里就实现了一个适合所有具有迭代器的容器的反向迭代器!也就是迭代器适配器(和stack、queue一样的概念),你传入什么容器的正向迭代器,编译器就会适配出什么样的反向迭代器,本质是对正向迭代器的一种封装!!!!

一、反向迭代器接口(用户层)

这里在复习一下两个接口:

rbegin()+rend()

rbegin():返回最后一个 元素的反向迭代器,即正向迭代器end的前一个位置。

rend():返回第一个元素之前理论元素的反向迭代器,即正向迭代器begin的前一个位置。

从上面的叙述中不难猜测出:对反向迭代器的++,实际上就是对正向迭代器的--!!

二、模拟实现

有了前面的铺垫这里直接上代码!!注意:这里的模板参数在和list的迭代器类是一样的

cpp 复制代码
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也是类似的写法,因为上面的模拟实现的反向迭代器是适合所有容器的反向迭代器,只要你有正向迭代器,传进来就能适配!!

cpp 复制代码
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;
		}
        // ...
    }
}

四、总结

①反向迭代器实际上是一个适配器,也叫迭代器适配器,适合所有容器。它实际上都是在调用对应的正向迭代器进行操作,反向的++,就是调用正向的--!

②反向迭代器本质就是对正向迭代器的一种封装!


希望今天的内容对你有帮助,感谢你的观看!!

相关推荐
有杨既安然2 小时前
Python自动化办公
开发语言·人工智能·深度学习·机器学习
虾球xz2 小时前
游戏引擎学习第221天:(实现多层次过场动画)
c++·学习·游戏引擎
King.6243 小时前
从 SQL2API 到 Text2API:开启数据应用开发的新征程
大数据·开发语言·数据库·sql·低代码
奇谱3 小时前
Quipus,LightRag的Go版本的实现
开发语言·后端·语言模型·golang·知识图谱
wuqingshun3141593 小时前
蓝桥杯 9. 九宫幻方
数据结构·c++·算法·职场和发展·蓝桥杯·深度优先
小小菜鸟,可笑可笑3 小时前
Python 注释进阶之Google风格
开发语言·python
哲科软件3 小时前
2025年C#人力外包趋势与价值分析
开发语言·c#
云格~3 小时前
L1-5 吉老师的回归
开发语言·c++·人工智能·算法·职场和发展·数据挖掘·回归
我真的不会C4 小时前
Qt中widget控件的常见属性
java·开发语言·qt
顾林海4 小时前
Flutter 图标和按钮组件
android·开发语言·前端·flutter·面试