反向迭代器 reverse_iterator简易实现

反向迭代器就是反向遍历的迭代器,他和正向迭代器有和很多功能是重复的,因此我们用适配器的形式来写反向迭代器。在这里,我们需要注意在库里rbegin()和rend()的指向位置,如图:

这里当我们使用*访问节点时,实际是访问反向迭代器指向的上一个节点,如:*rbegin(),访问的是rbegin()指向的上一个节点,也就是4。C++库里采用这种方式是为了形成一个对称(其他方式也能实现),在代码中我们也使用该方法进行实现。 

#pragma once

namespace bit
{
	// 适配器 -- 复用
	template<class Iterator, class Ref, class Ptr>
	struct Reverse_iterator
	{
		Iterator _it;
		typedef Reverse_iterator < Iterator, Ref, Ptr> self;
		Reverse_iterator(Iterator it)
		{
			_it = it;
		}
		self& operator ++()
		{
			 --_it;
			 return *this;
		}
		self operator ++(int)
		{
			Iterator tmp = _it;
			_it--;
			return tmp;

		}
		self operator --(int)
		{
			Iterator tmp = _it;
			_it++;
			return tmp;

		}
		self& operator --()
		{
			++_it;
			return *this;
		}
		
		Ref operator *()
		{
			Iterator tmp = _it;
			return *(--tmp);
		}
		Ptr operator ->()
		{
			Iterator tmp = _it;
			return &(*--tmp);
		}
		bool operator != ( const self& m)
		{
			return _it != m._it;
		}

	};
	
}

这里我们主要用了正向迭代器的功能,重载了相应的运算符,这样反向迭代器的外部就实现完成了。在我们自己实现的STL类中我们还要加入下列代码,才能使用。以List为例子(list的简易实现可以看前几期的博客),加入下列代码:

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

这样list里的反向迭代器就完成了,如果想实现其他STL容器的方向迭代器,只要加入上面这一段代码到相应STL容器的代码实现就行,这样实现了对Reverse_iterator类的代码重复使用,我们来运行试试 

#include "List.h"
using namespace bite;
int main()
{

	list<int> l(5, 1);
	l.push_back(2);
	list<int>::reverse_iterator it = l.rbegin();
	while (it != l.rend())
	{
		cout << *it << endl;
		it++;
	}
}

 运行结果如下:

讲解完毕,如有错误和疑问可以评论区提出。 

### C++迭代器的定义方式 在 C++ 中,迭代器是一种泛化指针的概念,用于访问容器中的元素。标准库提供了多种类型的迭代器以满足不同的需求。以下是几种常见迭代器的定义方式及其代码示例。 #### 正向迭代器 (Forward Iterator) 正向迭代器允许单向遍历序列中的元素。它支持前增操作 (`operator++`) 和解引用操作 (`*` 或 `->`) 来获取当前指向的对象[^1]。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4}; // 使用正向迭代器 for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 输出: 1 2 3 4 } } ``` #### 常量正向迭代器 (Constant Forward Iterator) 常量正向迭代器不允许修改所指向对象的内容,但它可以读取这些内容[^1]。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4}; // 使用 const_iterator 遍历并只读取数据 for (const auto& value : vec) { std::cout << value << " "; // 输出: 1 2 3 4 } // 显式声明 const_iterator for (std::vector<int>::const_iterator cit = vec.cbegin(); cit != vec.cend(); ++cit) { std::cout << *cit << " "; // 输出: 1 2 3 4 } } ``` #### 反向迭代器 (Reverse Iterator) 反向迭代器是从后向前遍历容器中的元素。它的行为类似于正向迭代器,只是方向相反。通常由底层实现提供适配器来转换成反向形式[^1]。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4}; // 使用 reverse_iterator 遍历 for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) { std::cout << *rit << " "; // 输出: 4 3 2 1 } } ``` #### 常量反向迭代器 (Constant Reverse Iterator) 这种迭代器结合了反向特性和不可变特性,既可以从后往前移动又无法更改其指向的数据项。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4}; // 使用 const_reverse_iterator 遍历 for (std::vector<int>::const_reverse_iterator crit = vec.crbegin(); crit != vec.crend(); ++crit) { std::cout << *crit << " "; // 输出: 4 3 2 1 } } ``` 以上展示了如何定义以及使用不同种类的迭代器,在实际开发过程中可以根据具体场景选择合适的迭代器类型以提高程序效率和安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值