反向迭代器

文章介绍了如何实现反向迭代器,首先通过自定义类的方式针对list创建了一般性的反向迭代器,但这种方法不适用于vector。然后提出了一个通用的解决方案,即通过在反向迭代器内部包含一个正向迭代器并包装其操作,实现了对list和vector都适用的反向迭代器。

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

反向迭代器

以list和vector为例, 来讲解反向迭代器

1. 一般想法的反向迭代器

首先来实现一个list的反向迭代器,一般容易想到的想法就是去重新写一个反向迭代器的类, 以链表的尾结点作为反向迭代器的头结点, 迭代器的++是往前走, 迭代器的–是往后走。当然可以实现list反向迭代器的功能

但是存在缺陷:

  1. 代码过于冗杂繁琐

  2. 对于list这种自定义类型对原生指针的封装的迭代器可以这样实现, 但是对于vector这种原生指针类型的迭代器是无法这样实现的

那我们能不能只写一种迭代器类, list和vector都能用的呢?

namespace yj	
{	
	//反向迭代器一般想法
	template<class T, class Ref, class Ptr>
	struct _list_reverse_iterator
	{
		typedef list_node<T> node;
		typedef _list_reverse_iterator<T, Ref, Ptr> self;

		node* _node;

		_list_reverse_iterator(node* n)    //结点析构交给链表
			:_node(n)
		{}

		//解引用
		Ref operator*()
		{
			return _node->_data;
		}


		Ptr operator->()
		{
			return &(_node->_data);
		}

		self& operator++()
		{
			_node = _node->_prev;

			return *this;
		}

		self& operator--()
		{
			_node = _node->_next;

			return *this;
		}

		self operator++(int)
		{
			self tmp(*this);
			_node = _node->_prev;

			return tmp;
		}

		self operator--(int)
		{
			self tmp(*this);
			_node = _node->_next;

			return tmp;
		}

		bool operator!=(const self& s)
		{
			return _node != s._node;
		}


		bool operator==(const self& s)
		{
			return _node == s._node;
		}
	};
    
    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 __list_reverse_iterator<T, T&, T*> reverse_iterator;

        reverse_iterator rbegin()
		{
			return reverse_iterator(_head->_prev);
		}

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

2. 真正的反向迭代器

参考库中反向迭代器的实现,发现:

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

在这里插入图片描述

这就实现了一个通用的迭代器,vector和list都可以使用,只需要在vector和list类中再封装和声明一下即可

namespace yj
{
	template<class Iterator, class Ref, class Ptr>
	struct ReverseIterator
	{
		typedef ReverseIterator<Iterator, Ref, Ptr> self;
		Iterator _cur;


		ReverseIterator(Iterator it)  //构造   
			:_cur(it)
		{}

		//解引用
		Ref operator*()               //返回 _cur的前一个位置
		{
			Iterator tmp = _cur;
			--tmp;
			return *tmp;
		}


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


		self& operator++()
		{
			--_cur;

			return *this;
		}


		self& operator--()
		{
			++_cur;

			return *this;
		}


		self operator++(int)
		{
			self tmp = *this;
			--_cur;
			return tmp;
		}


		self operator--(int)
		{
			self tmp=*this;
			++_cur;
			return tmp;
		}


		bool operator!=(const self& s)
		{
			return _cur != s._cur;
		}


		bool operator==(const self& s)
		{
			return _cur == s._cur;
		}
	};
}

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 ReverseIterator<iterator, T&, T*> reverse_iterator;
	typedef ReverseIterator<iterator, const T&, const T*> const_reverse_iterator;

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

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

vector类中的封装:

namespace yj
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
		typedef ReverseIterator<iterator, const T&, const T*> const_reverse_iterator;
		
		reverse_iterator rbegin()
		{
			return reverse_iterator(end());
		}

		reverse_iterator rend()
		{
			return reverse_iterator(begin());
		}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值