C++(反向迭代器)

本文介绍了反向迭代器的设计原理,通过多参数模板实现在vector和list容器中的应用,展示了如何创建并使用自定义反向迭代器进行反向遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

上一章我们介绍了适配器,也提了一下迭代器适配器,今天我们就从反向迭代器把迭代器适配器给解释一下。

既然 都叫迭代器容器了 就说名只要接口合适他可以封装实现各种容器需求包括vector list 。


目录

1.反向迭代器设计

1.1反向迭代器思想 

1.2多参数模板

2.vecor反向迭代器

3.list反向迭代器



1.反向迭代器设计

 反向迭代器 reverse_iterator 可以用来反向遍历容器,在某些场景下很实用

1.1反向迭代器思想 

因为数组比较简单,我们就从数组引出反向的思想。 

 

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

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

1.2多参数模板

在模拟实现list迭代器时候,我们在const对象对普通对象代码的复用的 过程中,引入了多参数模板,不同参数实现不同功能,反向迭代器的实现同样适用。有两点需要注意:

  • 重载operator*()返回的是目标对象的引用,又因为库里追求极致对称,所以我们应该先执行--操作后返回对象的引用。
  • 具体返回的对象是否需要const修饰,取决于我们使用的模板参数。

 

#pragma once
namespace cmx
{
	template <class iterator, class Ref, class Ptr>
	struct Reverselterator
	{
		typedef Reverselterator<iterator,  Ref,  Ptr> self;
		iterator _it;
		Reverselterator(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;
		}
					

	};

}

完成头文件的编写之后,我们就可以把他运用于所有可以用迭代器访问的容器 比如 vector list,只需要修改模版参数中正向迭代器的代码就可以适配出属于自己的反向迭代器。

2.vecor反向迭代器

 只需要引用 反向迭代器的头文件 ReverseIterator.h 就可以使用,具体代码如下:

#include<assert.h>
#include"ReverseIterator.h"

namespace cmx
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		typedef Reverselterator<iterator, T&, T*> reverse_iterator;
		typedef Reverselterator<const_iterator, const T&, const T*> const_reverse_iterator;


		reverse_iterator rebegin()
		{
			//this调用的end()函数
			return reverse_iterator(end());
		}
		reverse_iterator rend()
		{
			return reverse_iterator(begin());
		}

3.list反向迭代器

 代码如下:

	template<class T>
	class list
	{
		typedef list_node<T> Node;

	public:
		typedef __list_iterator<T, T&, T*> iterator;
		typedef __list_iterator<T, const T&, const T*> const_iterator;

		typedef Reverselterator<iterator, T&, T*> reverse_iterator;
		typedef Reverselterator<const_iterator, const T&, const T*> const_reverse_iterator;

### C++ String 反向迭代器的使用方法 在 C++ 中,`std::string` 提供了反向迭代器的功能,允许从字符串末尾向前遍历字符。以下是关于 `std::string` 的反向迭代器使用的详细介绍。 #### 创建和初始化反向迭代器 可以利用成员函数 `rbegin()` 和 `rend()` 来获取指向字符串最后一个有效字符位置以及理论上的前一个位置之前的反向迭代器: ```cpp #include <iostream> #include <string> int main() { std::string str = "hello"; // 获取反向迭代器 auto rit = str.rbegin(); } ``` #### 遍历整个字符串 通过循环结构配合上述获得的反向迭代器对象实现对字符串内所有元素按逆序访问的效果: ```cpp for (; rit != str.rend(); ++rit) { std::cout << *rit; } // 输出 olleh ``` 这里需要注意的是,在比较终止条件时应采用不等于运算符(`!=`)而非小于号(`<`);另外每次迭代操作后记得更新当前指针的位置即执行自增/自减动作以便移动到下一个目标处[^1]。 #### 查找特定子串并打印其后的部分 假设现在有一个需求是要找到某个指定模式第一次出现的地方之后的内容,则可借助标准库中的算法如 `std::search` 结合反向迭代来进行处理: ```cpp if (auto pos = std::search(str.rbegin(), str.rend(), std::boyer_moore_searcher( target_string.rbegin(), target_string.rend())); pos != str.rend()) { // 找到了匹配项 std::copy(pos.base(), str.end(), std::ostream_iterator<char>(std::cout)); } else { // 没有发现任何符合条件的结果 std::cout << "Not Found!"; } ``` 此段代码展示了当定位成功后如何继续输出剩余未被检索过的序列片段[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值