C++ 反向迭代器的设计与实现

这篇具有很好参考价值的文章主要介绍了C++ 反向迭代器的设计与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在本文开始之前,先明晰几个 关键词 的含义(T : 模板参数):

  • Ref : T& / const T&
  • Ptr : T* / const T*

一、反向迭代器设计的上帝视角

我们希望将 反向迭代器 设计成一种适配器——传 list::iterator 得到 list 的反向迭代器,传 vector::iterator 得到 vector 的反向迭代器。

template<class Iterator>
struct ReverseIterator
{
	Iterator cur;
    
    ReverseIterator(const Iterator& it)
        :cur(it)
    {}
};

STL 中,(正向)迭代器和反向迭代器是一种对称设计——rend() == begin() ,rbegin() == end() :

C++ 反向迭代器的设计与实现,C++,c++,1024程序员节,windows

对于反向迭代器重载++ / – ,我们只需要复用正向迭代器的 – / ++ 即可。

不过,需要注意的是,反向迭代器调用 it.operator*() 应取到 it 的前一个位置的数据(取数据时,不改变 it 的位置)。

C++ 反向迭代器的设计与实现,C++,c++,1024程序员节,windows

二、运算符重载细节介绍

为了使我们的反向迭代器能快速用起来,优先实现 ++ , * , -> , != 等功能,其余以此类推。

  • 重载 ++
template<class Iterator>
struct ReverseIterator
{
    ReverseIterator<Iterator>& operator++()
    {
        --cur;
        return *this;
	}
    
    ReverseIterator<Iterator> operator++(int)
    {
        Iterator tmp = cur;
        --cur;
        return tmp;// 存在隐式类型转换 <--> ReverseIterator<Iterator>(tmp);
	}
};

“为什么前置++ 的返回值不能是 cur ?”

error C2440:return: 无法从“Iterator”转换为“ReverseIterator<int *> &
  • 重载 * :引入一个模版参数 Ref
template<class Iterator, class Ref>
struct ReverseIterator
{
    Ref operator*()
    {
        Iterator tmp = cur;
        --tmp;
        return *tmp;
    }
};

当 tmp 的类型是 list::iterator,我们调用的 --tmp; return *tmp; ,编译器会调用 list 迭代器的运算符重载。

  • 重载 ->
template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
    Ptr operator->()
    {
        return &(operator*());
	}
};
  • 重载 !=
template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
    bool operator!=(const ReverseIterator<Iterator, Ref, Ptr>& l)
    {
        return cur != l.cur;
	}
};

ReverseIterator<Iterator, Ref, Ptr> 太长太过复杂,我们可以利用 typedef 进行简化。

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
    typedef ReverseIterator<Iterator, Ref, Ptr> Self;
    bool operator!=(const Self& l)
    {
        return cur != l.cur;
	}
};

PS: typedef ... 应放在 public 区域,否则非成员函数无法使用 typedef 后的命名文章来源地址https://www.toymoban.com/news/detail-840370.html

全部代码:

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
	Iterator cur;

	typedef ReverseIterator<Iterator, Ref, Ptr> Self;

	ReverseIterator(const Iterator& it)
		:cur(it)
	{}

	Self& operator++()
	{
		--cur;
		return *this;
	}

	Self operator++(int)
	{
		Iterator tmp = cur;
		--cur;
		return tmp;// 隐式类型转换
	}

	Self& operator--()
	{
		++cur;
		return *this;
	}

	Self operator--(int)
	{
		Iterator tmp = cur;
		++cur;
		return tmp;
	}

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

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

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

	Ptr operator->()// -> 返回数据的地址
	{
		return &(operator*());
	}
};

到了这里,关于C++ 反向迭代器的设计与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 我们要写出一个通用的反向迭代器模拟而且在保证代码简介不繁琐的的情况下,一定程度上使用我们自己模拟的已经封装好的iterator迭代器可以简化许多步骤,首先我们要知

    2024年02月14日
    浏览(42)
  • c++--反向迭代器的实现

    1.反向迭代器 迭代器有两种,一种是正向的,一种是反向的,方向迭代器的主要功能就是实现数据的反向访问,通过正向迭代器的适配生成的,适配器就是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一

    2024年02月16日
    浏览(31)
  • 【C++】STL反向迭代器模拟实现,迭代器适配器,迭代器类型简单介绍

    本篇主要讲反向迭代器的模拟实现。 能够加深各位对泛型的理解。 前面我那篇string介绍里面已经提到过反向迭代器是啥了,如果点进来的同学还不知道,可以看看:[string介绍](https://blog.csdn.net/m0_62782700/article/details/130796914? spm=1001.2014.3001.5501) 迭代器,可以在不暴露底层实现细

    2024年02月16日
    浏览(33)
  • 1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月07日
    浏览(61)
  • PHP框架开发实践 | 1024 程序员节:通过index.php找到对应的controller是如何实现的

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:PHP进阶实战教程。 🎉欢迎 👍点赞✍评论⭐收藏

    2024年02月08日
    浏览(57)
  • C++ stl迭代器的理解

    首先,stl采用了泛型编程,分成了容器和算法,容器和算法之间的桥梁是迭代器,迭代器的作用是可以让算法不区分容器来作用在数据上。 迭代器本质上是指针,原有类型(比如int,double等)的指针也可以是迭代器,那如何让代码区分开他们呢? 我们可以把自定义的迭代器包

    2024年02月15日
    浏览(36)
  • C++与JAVA中迭代器的不同

     C++的迭代器如同指针一样,从容器(vector举例)开头,一直指向容器 最后一位的后一位置。 JAVA的迭代器则指在 容器的空隙间 ,如下图所示。 如果找不到下一个元素(无元素可越),next就会抛出异常,因此,先通过hasNext判断有无下一个元素。

    2024年02月12日
    浏览(25)
  • 深入篇【C++】手搓模拟实现list类(详细剖析底层实现原理)&&模拟实现正反向迭代器【容器适配器模式】

    1.一个模板参数 在模拟实现list之前,我们要理解list中的迭代器是如何实现的。 在vector中迭代器可以看成一个指针,指向vector中的数据。它的解引用会访问到具体的数据本身,++会移动到下一个数据位置上去,这些都是因为vector具有天生的优势:空间上是连续的数组,这样指

    2024年02月15日
    浏览(33)
  • 1024 程序员节,圆一个小小的梦

    Hope is a good thing, maybe the best of things, and no good thing ever dies. 希望是件美丽的东西,也许是最好的东西,而美好的东西是永远不会消逝的。 大家好,我是勇哥 。 1024 , 程序员节,圆了我一个小小的梦。 花了半年时间,我写了一本电子书 ,书名是:《 RocketMQ4.X设计精要 》,我想

    2024年02月08日
    浏览(50)
  • 程序员帮助程序员!用1024拼出更美好的云计算未来

    中国的云计算市场是全球增长最快的。据预测,中国公共云服务市场的全球份额将从 2020 年的 6.5% 增加到 2024 年的 10.5% 以上。 伴随行业的迅速发展,催生了云计算相关人才需求的井喷增长,供需矛盾凸显。据德意志银行分析报告,越来越多IT企业关闭了线下IDC,开始把业务迁

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包