C++反向迭代器的实现

一、反向迭代器的定义

  • 在容器中从尾元素向首元素反向移动的迭代器

  • 对于反向迭代器,递增和递减的含义会颠倒过来

  • 递增一个反向迭代器会移动到前一个元素

  • 递减一个迭代器会移动到下一个元素

二、反向迭代器的实现

cpp 复制代码
// 适配器 -- 复用
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
	typedef Reverse_iterator<Iterator, Ref, Ptr> Self;
	Iterator _it;
	Reverse_iterator(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)
	{
		return _it == s._it;
	}
	bool operator!=(const Self& s)
	{
		return _it != s._it;
	}
};

在实现时。我们实际是复用iterator,来实现Reverse_iterator。

所以在构造函数中,我们直接使用iterator对反向迭代器进行初始化。

在解引用操作时,因为从end()位置开始,所以要先--,获得新的位置,但不改变原来的_it ,所以建立一个临时对象对其进行--操作。

三、rbegin以及rend

为了实现rbegin或者rend,我们首先要在list或者vector中定义:

cpp 复制代码
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;

rbegin:

cpp 复制代码
reverse_iterator rbegin()
{
	return reverse_iterator(end());
}

const_reverse_iterator rbegin() const
{
	return const_reverse_iterator(end());
}

rend:

cpp 复制代码
reverse_iterator rend()
{
	return reverse_iterator(begin());
}

const_reverse_iterator rend() const
{
	return const_reverse_iterator(begin());
}
相关推荐
七七&5566 小时前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang
java坤坤6 小时前
GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
开发语言·后端·golang
元清加油6 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
健康平安的活着6 小时前
java之 junit4单元测试Mockito的使用
java·开发语言·单元测试
No0d1es6 小时前
电子学会青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
c语言·c++·算法·青少年编程·电子学会·五级
DjangoJason8 小时前
C++ 仿RabbitMQ实现消息队列项目
开发语言·c++·rabbitmq
m0_480502648 小时前
Rust 入门 KV存储HashMap (十七)
java·开发语言·rust
大阳1238 小时前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
YA3338 小时前
java基础(九)sql基础及索引
java·开发语言·sql
奇树谦9 小时前
QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
开发语言·qt