反向迭代器

2023-05-30 11:20:19 浏览数 (4)

反向迭代器

我们在实现正向迭代器的时候,它的 是下一个元素,--为上一个元素。对于反向迭代器它就是相反的, 为上一个元素,--为下一个元素 反向迭代器是复用了正向迭代器iterator

代码语言:javascript复制
cpptemplate <class Iterator,class Ref,class Ptr>
class __reverse_iterator
{
	Iterator _it;
	typedef __reverse_iterator<Iterator, Ref, Ptr> Self;
public:
	__reverse_iterator(Iterator it)
		:_it(it){}
	Self& operator  ()
	{
		--_it;
		return *this;
	}
	Self& operator  (int)
	{
		Iterator temp(_it);
		--_it;
		return Slef(temp);
	}
	Self& operator--()
	{
		  _it;
		return *this;
	}
	Self& operator--(int)
	{
		Iterator temp(_it);
		  _it;
		return Slef(temp);
	}
	Ref operator*()
	{
		Iterator temp(_it);
		return *(--temp);
	}
	Ptr operator->()
	{
		//return &(*_it);不能这样写,因为我们要访问当前节点的前一个数据
		return &(operator*());
	}
	bool operator==(const Self& it)
	{
		return _it == it._it;
	}
	bool operator!=(const Self& it)
	{
		return _it != it._it;
	}
};

list反向迭代器的使用

代码语言:javascript复制
cpp	typedef __reverse_iterator<iterator, T&, T*> reserve_iterator;
	typedef __reverse_iterator<const_iterator, const T&, const T*> const_reserve_iterator;

	reserve_iterator rbegin()
	{
		return reserve_iterator(end());
	}
	reserve_iterator rend()
	{
		return reserve_iterator(begin());
	}
	const_reserve_iterator rbegin()const
	{
		return reserve_iterator(end());
	}
	const_reserve_iterator rend()const
	{
		return reserve_iterator(begin());
	}

反向迭代器的头为为正向迭代器的尾,正向迭代器的尾为反向迭代器的头,所以我们设计反向迭代器的时候在访问里面数据的时候,需要访问当前节点的后一个节点的值。 因为反向迭代器的头为尾,里面不是有效数据,这样设置的目的是为了和正向迭代器保持对称。

vector的反向迭代器

代码语言:javascript复制
cpp	typedef __reverse_iterator<iterator, T&, T*> reverse_iterator;
	typedef __reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;

	reverse_iterator rbegin()
	
	{
		return reverse_iterator(end());
	}
	const_reverse_iterator rbegin()const
	{
		return reverse_iterator(end());
	}
	reverse_iterator rend()
	{
		return reverse_iterator(begin());
	}
	const_reverse_iterator rend()const
	{
		return reverse_iterator(begin());
	}

0 人点赞