当前位置: 首页 > article >正文

C++初阶学习——探索STL奥秘——反向迭代器

适配器模式是 STL 中的重要组成部分,除了容器适配器外,还有 选代器适配器,借助 选代器适配器 ,可以轻松将各种容器中的普通迭代器转变为反向迭代器,这正是适配器的核心思想

注:库中的反向迭代器在设计时,为了最求极致的对称,rbegin()指向最后一个有效元素的下一个位置,rend()指向第一个有效元素(位置是与正向迭代器相反的)

在模拟实现 list 迭代器类时,为了解决普通对象与 const 对象的代码冗余问题,引入了多参数,通过对形参传递不同的对象,变换为不同属性的迭代器

在STL库中就有这样的应用

在反向迭代器类中,这一种巧妙思想也得到了继承

namespace bit
{
	template<class Iterator, class Ref, class Ptr>
	struct ReverseIterator
	{
		typedef ReverseIterator<Iterator, Ref, Ptr> Self;
		Iterator _it;

		ReverseIterator(Iterator it)
			:_it(it)
		{}

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

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

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

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

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

值得一提的是,其中这段代码:

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

它返回的并非当前所指向的对象,而且上一个对象

原因:


http://www.kler.cn/a/317719.html

相关文章:

  • Flink中自定义Source和Sink的使用
  • `node-gyp` 无法找到版本为 `10.0.19041.0` 的 Windows SDK
  • 如何保护 Microsoft 网络免受中间人攻击
  • 基于springboot的汽车租赁管理系统的设计与实现
  • #include<string>和#include<string.h>有什么区别
  • 量化交易系统开发-实时行情自动化交易-3.4.2.2.Okex交易数据
  • [Leetcode 543][Easy]-二叉树的直径-递归
  • ubuntu安装StarQuant
  • 【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL22
  • 【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系
  • 高级java每日一道面试题-2024年9月20日-分布式篇-什么是CAP理论?
  • 【Java】Java开发全攻略:从环境搭建到高效编程
  • vulnhub-prime1
  • Android 检测图片抓拍, 聚焦图片后自动完成拍照,未对准图片的提示请将摄像头对准要拍照的图片
  • 红书 API 接口:笔记详情数据接口的接入与使用
  • IDEA 关闭自动补全功能(最新版本)
  • 【我的 PWN 学习手札】House of Botcake —— tcache key 绕过
  • 我从家庭提取的动态IP是独享的吗?
  • RK3568笔记六十二:使用V4L2读取摄像头并在LCD上显示
  • TypeScript-面向对象(接口、类、对象、泛型)
  • 1.5 计算机网络的性能指标
  • Git可视化工具和基础命令
  • vue3<script setup>中使用reactive包裹的对象被重新赋值失去响应式原因和解决方式
  • C#控件开发能够阅读的书籍
  • ESP8266+DHT11+Python制作一个物联网温湿度传感器
  • 基于C#+SQL Server2005(WinForm)图书管理系统