【反向迭代器】—— 我与C++的不解之缘(十七)

ops/2024/11/25 12:46:03/

前言

​ 在STL中的迭代器部分,之前只关注与正向迭代器,忽视了反向迭代器;现在来看一下反向迭代器到底是个什么东西,以及反向迭代器怎么实现,怎么为之前自己模拟实现的容器增加反向迭代器?

反向迭代器的使用

​ 首先,先来看一下反向迭代器是个什么东西,怎么使用?
在这里插入图片描述

这里以vectorlist 为例,看一下正向迭代器和反向迭代器的区别。

vector 的反向迭代器

#include<iostream>
#include<vector>
#include<list>using namespace std;
void test_vector()
{vector<int> v;int arr[] = { 1,2,3,4,5,6,7,8,9 };for (auto e : arr){v.push_back(e);}//正向迭代器vector<int>::iterator it = v.begin();cout << "正向迭代器遍历: ";while (it != v.end()){cout << *it << " ";++it;}cout << endl;//反向迭代器vector<int>::reverse_iterator rit = v.rbegin();cout << "反向迭代器遍历: ";while (rit != v.rend()){cout << *rit << " ";++rit;}cout << endl;
}int main()
{test_vector();return 0;
}

输出结果:

正向迭代器遍历: 1 2 3 4 5 6 7 8 9
反向迭代器遍历: 9 8 7 6 5 4 3 2 1

list 的反向迭代器

void test_list()
{list<int> l;int arr[] = { 1,2,3,4,5,6,7,8,9,0 };for (auto e : arr){l.push_back(e);}list<int>::iterator it = l.begin();cout << "正向迭代器遍历: ";while (it != l.end()){cout << *it << ' ';++it;}cout << endl;list<int>::reverse_iterator rit = l.rbegin();cout << "正向迭代器遍历: ";while (rit != l.rend()){cout << *rit << ' ';++rit;}cout << endl;
}int main()
{//test_vector();test_list();return 0;
}
正向迭代器遍历: 1 2 3 4 5 6 7 8 9 0
正向迭代器遍历: 0 9 8 7 6 5 4 3 2 1

​ 通过结果,我们可以看到,无论是vector 还是list 正向迭代器是正向遍历,而反向迭代器则是反向遍历。

再回过头看rbeginrend 函数:

  • rbegin 函数,返回容器一个指向容器最后一个元素的反向迭代器。。
  • rend 函数,返回容器表示反向迭代结束的反向迭代器。

反向迭代器的模拟实现

​ 看完反向迭代器的使用,那反向迭代器到底是如何实现的呢?

如果第一次看到这个问题,感觉会和第一次看到const_iterator 那样,想着去单独实现一个反向迭代器,但是那样太麻烦了。

根据正向迭代器和反向迭代器的使用比较,我们发现几个特点:

  • 反向迭代器的++ 相当于正向迭代器的--
  • 反向迭代器的-- 相当与正向迭代器的++

​ 那么这样,我们是不是就可以考虑将反向迭代器写成一个模板呢,只要你给我传模板参数(iterator 正向迭代器),我就能给你生成其对应的反向迭代器。

反向迭代器实现模板:

namespace HL
{template<class Iterator, class Ref, class Ptr>class my_reverse_iterator{typedef my_reverse_iterator<Iterator, Ref, Ptr> self;public:my_reverse_iterator() {}my_reverse_iterator(const Iterator& it){_it = it;}self operator--(){Iterator ret = _it;--_it;return ret;}self operator--(int){--_it;return _it;}self operator++(){Iterator ret = _it;++_it;return ret;}self operator++(int){++_it;return _it;}bool operator==(const self& it) const{return _it == it._it;}bool operator!=(const self& it) const{return _it != it._it;}Ref operator*(){	Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return _it->;}private:Iterator _it;};
}

​ 到这里,反向迭代器就简单的实现出来了(自己写的与库里面的不一样),现在来对应一下vectorlist

vector

​ 这里用一下之前的代码,来对应使用一个反向迭代器。

源代码链接:study/study_11_17_反向迭代器 · 努力学习的小廉/C++学习 - 码云 - 开源中国

由于代码过长,这里就只显示增加的部分了。

	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());}

list

	public:typedef reverse_iterator<iterator, T&, T*> iterator;typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;reverse_iterator rebgin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}

​ 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws


http://www.ppmy.cn/ops/136570.html

相关文章

windows vscode C++ 简明教程

windows vscode C++ 简明教程 1 安装mingw64 MinGW-w64(Minimalist GNU for Windows 64)是一个开源工具集,用于在 Windows 系统上编译和生成原生的 Windows 应用程序。它是 MinGW 项目的扩展版本,支持 32 位和 64 位 Windows 程序开发。MinGW-w64 提供了 Windows 版的 GN…

归并排序与逆序对问题(C语言版)

一、引言 归并排序是一种高效且稳定的排序方法&#xff0c;而逆序对问题是算法领域的一个经典问题&#xff0c;本文教大家如何实现归并排序&#xff0c;以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解&#xff1a;将待排序的数组分成两半&#xff0c…

windows11下git与 openssl要注意的问题

看了一下自己贴文的历史&#xff0c;有一条重要的忘了写了。 当时帮有位同事配置gitlab&#xff0c;众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题&#xff0c;如配置代理&#xff0c;sshkey&#xff0c;私有库&#xff0c;等等&#xff0…

数据集-目标检测系列- 安全背心 检测数据集 safety_vests >> DataBall

数据集-目标检测系列- 安全背心 检测数据集 safety DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gi…

IDEA2023 SpringBoot整合MyBatis(三)

一、数据库表 CREATE TABLE students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT,gender ENUM(Male, Female, Other),email VARCHAR(100) UNIQUE,phone_number VARCHAR(20),address VARCHAR(255),date_of_birth DATE,enrollment_date DATE,cours…

RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答

RAG&#xff08;Retrieval Augmented Generation 检索增强生成&#xff09;是目前业界中的一种主流方法&#xff0c;通过增加额外知识的方式来减少大语言模型&#xff08;LLM&#xff09;的幻觉问题&#xff08;一本正经的胡说八道&#xff09;。 RAG 系统概览 如上图所示&…

平安产险厦门分公司:深化风险减量服务,开展安全驾驶巡回培训

为进一步提升管理货运车辆的企业客户的安全生产能力&#xff0c;增强驾驶员的安全意识与驾驶技能&#xff0c;平安产险厦门分公司秉持“金融为民”初心&#xff0c;积极践行金融工作政治性、人民性&#xff0c;开展“风险减量”专项行动——《风险减量&#xff0c;安全驾驶》巡…

字符串-07-判断两个IP是否属于同一子网

文章目录 1. 题目描述2. 思路3. 代码 1. 题目描述 IP地址是由4个0-255之间的整数构成的&#xff0c;用"."符号相连。 二进制的IP地址格式有32位&#xff0c;例如&#xff1a;10000011&#xff0c;01101011&#xff0c;00000011&#xff0c;00011000&#xff1b;每八…