【C++】反向迭代器的设计

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

+前言

STL中不少的容器需要有迭代器这样的设计,特别是正向迭代器,几乎每个容器都有自己的特定实现方式,有了正向迭代器之后,我们还要提供反向迭代器以供一些特殊的需求,但是许多容器的正向迭代器实现的方式不一样,如果我们要实现其反向迭代器,每个容器的反向迭代器的实现方式也不一样,有没有一种方法能够统一反向迭代器的实现方式呢?

有的,那就是拿已有的正向迭代器进行封装,这样只要我们实现了正向迭代器,反向迭代器自然而然就形成了,本篇文章我们就来一起探究这种设计方式。

一、反向迭代器的结构

我们设计的反向迭代器是用正向迭代器实现的,这样反向迭代器的实现方式就统一了,那么我们反向迭代器的成员变量就是一个正向迭代器,关于成员函数,我们反向迭代器提供的接口与正向迭代器提供的接口一样。

//第一个模板参数传递 正向迭代器,第二个传递 迭代器的引用 第三个传递 迭代器的地址
 template<class Iterator, class Ref, class Ptr>
 
 //用struct定义类,因为我们想要公开我们的接口
 struct _reverse_iterator
 {
 	//对自己进行typedef方便使用
 	typedef _reverse_iterator<Iterator, Ref, Ptr> self;
    //成员变量 是一个正向迭代器
    Iterator _current;
    
    //构造函数   用一个正向迭代器进行初始化反向迭代器对象
    _reverse_iterator(Iterator it)
        :_current(it)
    {}
    //*运算符重载
    Ref operator*();
    //前置++运算符重载
    self& operator++();
    //后置++运算符重载
    self operator++(int)
    //前置--运算符重载
    self& operator--()
    //后置--运算符
    self operator--(int)
    //->操作符
    Ptr operator->()
    //关系运算符
    bool operator!=(const self& s);
    bool operator==(const self& s);

 }

容器类内的rbeginrend 函数

//类内使用反向迭代器
class myclass
{
     //此类内要配套有一个正向迭代器iterator,然后传给外面的反向迭代器

     //将反向迭代器进行typedef方便使用
     typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;
      //反向迭代器
     typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;

     //反向迭代器
     reverse_iterator rbegin()
     {
    	return reverse_iterator(end());
     }
     reverse_iterator rend()
     {
     	return reverse_iterator(begin());
     }

     //const反向迭代器
     const_reverse_iterator rbegin() const
     {
     	return const_reverse_iterator(end());
     }
     const_reverse_iterator rend() const
     {
    	return const_reverse_iterator(begin());
     }
};

注意: 反向迭代器这里我们采用了对称结构便于理解对比,但这也导致我们后面在进行*解引用操作符时要解引用前一个位置!
【C++】反向迭代器的设计

二、反向迭代器的接口实现

1、*运算符重载

我们可以创建一个局部对象,对局部对象进行--找到前一个位置,然后再进行解引用返回就行了。

//*运算符重载
Ref operator*()
{
	//这里是不用写拷贝构造的,默认的拷贝构造会对内置类型进行值拷贝,对自定义类型调用它的拷贝构造
	Iterator tmp = _current;
	--tmp;
	return *tmp;
}

2、算术运算符 ++ - -的重载

由于我们的反向迭代器是由正向迭代器实现的,反向迭代器++就相当于正向迭代器- - ,明白了这个就很好实现算术运算符重载了。

//前置++运算符重载
self& operator++()
{
	--_current;
	return(*this);
}
//后置++运算符重载
self operator++(int)
{
	//保存当前对象
	self tmp(*this);
	--_current;
	//返回--之前的对象
	return tmp;
}
//前置--运算符重载
self& operator--()
{
	++_current;
	return (*this);
}
//后置--运算符
self operator--(int)
{
	self tmp(*this);
	++_current;
	return tmp;
}

3、->操作符重载

->运算符重载我们只需要返回容器中存储的自定义类型的对象的地址就行了,我们可以先调用operator*()拿到容器中存储的对象,然后再进行取地址&

Ptr operator->()
{
	return &(operator*());
}

3、关系运算符

要判断两个反向迭代器相不相等,只需要判断反向迭代器里面的成员变量相不相等就行了。

//关系运算符
bool operator!=(const self& s)
{
	return _current != s._current;
}
bool operator==(const self& s)
{
	return _current == s._current;
}

到这里我们的反向迭代器就已经形成了。

三、关于反向迭代器的一些讨论

由于我们的反向迭代器是用模板写的,当我们将vector的迭代器类型传递过去时,我们的反向迭代器就变成了vector的反向迭代器,当我们将list的迭代器传递过去时,就形成了list的反向迭代器。

传递的迭代器必须的二元迭代器,可以++ ,- -。forward_list的迭代器就不行!

例如:实现vector的反向迭代器,我们只需要在类内部传递一下正向迭代器,然后typedef一下就行了。文章来源地址https://www.toymoban.com/news/detail-432186.html

template<class T>
class vector
{
public:
	//正向迭代器
	typedef  T* iterator;

	//反向迭代器   将正向迭代器进行传递给反向迭代器
	typedef _reverse_iterator<iterator, T&, T*> reverse_iterator;
	typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;

	//普通迭代器  ------------------------------------------------
	iterator begin();
	iterator end();
	

	//const迭代器
	typedef const T* const_iterator;
	const_iterator begin() const;
	const_iterator end() const;
	
	//反向迭代器
	reverse_iterator rbegin()
	{
		return reverse_iterator(end());
	}
	reverse_iterator rend()
	{
		return reverse_iterator(begin());
	}

	//const反向迭代器
	const_reverse_iterator rbegin() const
	{
		return const_reverse_iterator(end());
	}
	const_reverse_iterator rend() const
	{
		return const_reverse_iterator(begin());
	}
	...... 
	...... 
	...... 
};

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

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

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

相关文章

  • [C++历练之路]优先级队列||反向迭代器的模拟实现

    W...Y的主页 😊  代码仓库分享💕 🍔前言: 在C++的宇宙中,优先队列似乎是一座巨大的宝库,藏匿着算法的珍宝。而就在这片代码的天空下,我们不仅可以探索优先队列的神奇,还能够揭开反向迭代器的神秘面纱。让我们一同踏入这个编程的探险之旅,在这里,我们将用C

    2024年02月04日
    浏览(48)
  • C++ [STL容器反向迭代器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 我们知道STL大部分容器都有迭代器,迭代器又分为正向迭代器和反向迭代器,对于正向迭代器以及实现前面我们已经了解了不少,而反向迭代器的设计思想是 适配器模式 ,本节我们介绍反向迭代器的实现! 适配器是把一个类的接

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

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

    2024年02月16日
    浏览(42)
  • 【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存

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

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

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

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

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

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

    2024年02月12日
    浏览(32)
  • C++ 反向迭代器

    反向迭代器的++即正向迭代器的--,反向迭代器的--即正向迭代器的++,反向迭代器和正向迭代器的很多功能都是相似的,因此我们可以复用正向迭代器作为反向迭代器的底层容器来封装,从而实现出反向迭代器,即: 反向迭代器内部可以包含一个正向迭代器,对正向迭代器的

    2024年02月07日
    浏览(41)
  • 细说C++反向迭代器:原理与用法

    迭代器与反向迭代器的概念引入 迭代器(Iterator)是C++标准模板库(STL)中的一个核心概念,它提供了一种访问容器中元素的方式,而无需了解容器底层的实现细节。迭代器就像是一个指向容器中元素的指针,通过它可以遍历容器中的元素,进行读取、修改或删除操作。 反向

    2024年03月18日
    浏览(41)
  • C++【栈&队列(3种)&反向迭代器】

    适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 后面所介绍的栈,队列,反向迭代器都是一种适配器。 虽然stack和queue中也可以存放元素,但在STL中

    2023年04月17日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包