C++【STL】之反向迭代器

news/2024/11/29 20:46:48/

反向迭代器

前面在vector和list的模拟实现中都有讲到正向迭代器,今天我们就来讲解一下反向迭代器的思想和模拟实现,在某些场景下还是很实用的,下面正文直接开始。

文章目录:

  • 反向迭代器
    • 1. 反向迭代器结构
    • 2. 反向迭代器实现
      • 2.1 多参数模板
      • 2.2 对称思想
      • 2.3 完整代码
    • 3. 反向迭代器vector应用
    • 4. 反向迭代器list引用

1. 反向迭代器结构

反向迭代器reverse_iterator用于反向遍历容器,它也是由一个类来封装的

template<class Iterator>
struct __reverse_iterator
{Iterator _cur;	//正向迭代器类做成员变量__reverse_iterator(Iterator cur) //构造正向迭代器:_cur(cur){}//...
};

STL库中反向迭代器的设计讲究完美的对称性,rbegin() 指向最后一个有效元素的下一个位置,rend() 指向第一个有效元素,与正向迭代器的指针位置刚好相反

拿vector对象举个例子

Self& operator++()
{--_cur; //正反迭代器,++,--反向操作return *this;
}Self& operator--()
{++_cur;return *this;
}

2. 反向迭代器实现

反向迭代器的实现主要还是依于对正向迭代器的复用,外加了一点小细节思想,这里我们实现的依旧是简易版本

2.1 多参数模板

前面在模拟实现list时,运用了多参数模板来解决const对象代码冗余问题,在反向迭代器的实现中也运用了相同原理,通过对形参传递不同的对象,变换为不同的迭代器

template<class Iterator, class Ref, class Ptr>
struct __reverse_iterator
{//...
};

其中Ref表示引用对象,Ptr表示指针对象

2.2 对称思想

STL大佬在设计反向迭代器时,为了追求与正向迭代器的对称,将首尾指针得到指向反向保持一致,如上图,即rbegin()end()位置,rend()begin()位置

在这样的设计下,rbegin()rend()的实现就可以直接对应复用了,而operator*()返回的就不是当前所指向的对象,而是成了上一个对象

reverse_iterator rbegin() 
{ reverse_iterator(end()); 
}reverse_iterator rend() 
{ reverse_iterator(begin()); 
}

operator*()

Ref operator*()
{Iterator tmp = _cur;return *--tmp;	//返回上一个对象
}

2.3 完整代码

至于其他的实现都是复用的正向迭代器,比较简单,这里直接上完整代码,相信大佬,们一看就能明白

#pragma once
namespace Sakura
{template<class Iterator, class Ref, class Ptr>struct __reverse_iterator{typedef __reverse_iterator<Iterator, Ref, Ptr> self; //重命名Iterator _cur; //正向迭代器类做成员变量__reverse_iterator(Iterator cur) //构造正向迭代器:_cur(cur){}Ref operator*(){Iterator tmp = _cur;return *--tmp;}Ptr operator->(){return &(operator*());}self& operator++(){--_cur;return *this;}self operator++(int){self tmp(*this);--_cur;return tmp;}self& operator--(){++_cur;return *this;}self operator--(int){self tmp(*this);++_cur;return tmp;}bool operator!=(const self& s){return (_cur != s._cur);}bool operator==(const self& s){return (_cur == s._cur);}};
}

3. 反向迭代器vector应用

vector 类中,定义出反向迭代器所需的函数即可

template<class T>
class vector
{
public://反向迭代器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_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}//...
};

4. 反向迭代器list引用

list 类中,定义出反向迭代器所需的函数即可

template<class T>
class list
{
public://反向迭代器typedef __reverse_iterator<iterator, T&, T*> reverse_iterator;typedef __reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;reverse_iterator rbegin() { return reverse_iterator(end()); }reverse_iterator rend() {return reverse_iterator(begin()); }const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }//...
};

C++【STL】之反向迭代器,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!

文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正!


http://www.ppmy.cn/news/531911.html

相关文章

关于Synchronized的小结

目录 一.特性 1.既是乐观锁又是悲观锁 2.是轻量级锁,也是重量级锁 3.不是读写锁,是互斥锁 4.是可重入锁 5.非公平锁 6.加锁之后,运行完毕自动解锁释放资源 二:Synchronized使用 第一种:定义一个额外的变量来控制加锁和解锁(类似于吉祥物) 第一种:直接给类/方法上锁 三…

L2-014 列车调度 (25 分)

L2-014 列车调度 (25 分) 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&#xff0c;最后从出口…

427-二叉树(617.合并二叉树、700.二叉搜索树中的搜索、98. 验证二叉搜索树、530.二叉搜索树的最小绝对差)

617.合并二叉树 class Solution { public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 nullptr) return root2;if (root2 nullptr) return root1;root1->val root2->val;root1->left mergeTrees(root1->left, root2->left);r…

【卡特兰数】HJ77.火车进站

题目&#xff1a; 描述 给定一个正整数N代表火车数量&#xff0c;0<N<10&#xff0c;接下来输入火车入站的序列&#xff0c;一共N辆火车&#xff0c;每辆火车以数字1-9编号&#xff0c;火车站只有一个方向进出&#xff0c;同时停靠在火车站的列车中&#xff0c;只有后进站…

210920-车站问题

mainByHuber.cpp 文件&#xff1a; #include <iostream> #include <string.h> #include<stdlib.h> struct station_info{char station_name[100]; }; struct station_node{station_info s;station_node * next; };int findStation(station_node * head,cha…

12306一直显示服务器忙,网购春运火车票首日 12306网站又现服务器忙

①青岛火车站售票大厅内&#xff0c;购票回家的旅客已明显增多。 ②来自广西的杨先生和同伴们准备拎着行李提前回家。据了解&#xff0c;他们在船厂工作&#xff0c;由于天冷活少&#xff0c;所以提前放假了。 ③"小候鸟"在妈妈的背后等候进站上车。 本版图/记者 孙传…

L2-014 列车调度 - JAVA

L2-014 列车调度 题目描述&#xff1a; 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08; Entrance &#xff09;轨道和一条出口&#xff08; Exit &#xff09;轨道&#xff0c;它们之间有 N 条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&…

7-2 列车调度(25 分)

火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&#xff0c;最后从出口离开。在图中有9趟列车…