反向迭代器的实现

发布于:2024-06-17 ⋅ 阅读:(118) ⋅ 点赞:(0)

        对于带有迭代器的容器,有正向迭代器,也有反向迭代器,而正向迭代器和反向迭代器比较相似,所以我们可以写一个反向迭代器的模板,给编译器,从传不同的容器的正向迭代器,实例化出对应的反向迭代器,也就是对正向迭代器进行封装,实现反向迭代器,

比如:

template<class Iterator,class Ref,class Ptr>
struct ReverseIterator
{
	typedef ReverseIterator<Iterator, Ref, Ptr> Self;
	Iterator _it;
	ReverseIterator(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)
	{
		return _it != s._it;
	}

};
//反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;

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

 

这是以list为例,实现的反向迭代器;

 rbegin在end处,也就是哨兵位的地方,rend在begin处,这样写是为了和正向迭代器对称;

Ref operator*()
    {
        Iterator tmp = _it;
        return *(--tmp);//返回当前节点的上一个节点的值
    }

 当我i们返回节点时,先 -- 解引用,这样得到的是前一个节点的值,这样就可以解决哨兵位没有有效值的问题了;这个过程是对正向迭代器进行封装实现反向迭代器!


网站公告

今日签到

点亮在社区的每一天
去签到