C++:反向迭代器reverse_iterator

反向迭代器是C++ STL(标准模板库)中的一种迭代器类型,它允许我们逆向遍历容器(如std::vector, std::list, std::deque等)中的元素。反向迭代器指向容器的“尾部”元素,并通过递减操作向前移动(即向容器的开始方向移动)。

通过前面list的模拟实现知道,反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。

一、反向迭代器的类模板参数

template<class Iterator>
//Iterator为正向迭代器,反向迭代器复用正向迭代器的相反操作实现

反向迭代器的模板参数class Ref与class Ptr可以省略,因为Iterator内部同样有模板参数class Ref与class Ptr。

typedef typename Iterator::Ref Ref;//与正向迭代器相同,operator*()的返回值类型
typedef typename Iterator::Ptr Ptr;//operator->()的返回值类型

注意:此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量。

二、反向迭代器的封装

封装实现反向迭代器, 要先定义一个Iterator cur成员变量以复用Iterator的运算符操作

构造函数:

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator 
{
	typedef ReverseIterator<Iterator, Ref, Ptr> Self;
	Iterator cur;

	ReverseIterator(Iterator it)
		:cur(it)
	{}
};

 operator*()与operator->():
反向迭代器是正向迭代器的逆置,其rbegin()为第一个元素为Iterator的最后一个元素的下一个,因此反向迭代器的operator*()需要访问元素先进行--操作。

Ref operator*() {
	Iterator tmp = cur;//访问元素由tmp进行--操作
	--tmp;
	return *tmp;
}

//operator->()复用operator*(),&operator*()为节点数据的地址
Ptr operator->() {
	return (&operator*());
}

前置++、--和后置++、--: 

反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++。

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

Self operator++(int) {
	Iterator tmp(cur);
	--cur;
	return tmp;
}

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

Self operator--(int) {
	Iterator tmp(cur);
	++cur;
	return tmp;
}

反向迭代器的比较与正向迭代器一致:

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

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

 三、rbegin()与rend()

reverse_iterator rbegin() {
	return reverse_iterator(end());
}

reverse_iterator rend() {
	return reverse_iterator(begin());
}

完整实现如下 :

template<class Iterator, class Ref, class Ptr>
struct ReverseIterator {
	typedef ReverseIterator<Iterator, Ref, Ptr> Self;
	Iterator cur;

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

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

	Self operator++(int) {
		Iterator tmp(cur);
		--cur;
		return tmp;
	}

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

	Self operator--(int) {
		Iterator tmp(cur);
		++cur;
		return tmp;
	}

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

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

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

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

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值