【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;
		}
        // ...
    }
}

四、总结

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

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


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

相关推荐
懒大王爱吃狼39 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷2 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨2 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
XiaoLeisj4 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师5 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉5 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer5 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java7 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山7 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js