详解反向迭代器适配器

目录

一、基本介绍

二、模拟实现

2.1 - operator*

2.2 - vector 和 list 的反向迭代器


 


一、基本介绍

反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历。

反向迭代器底层只能选择双向迭代器或者随机访问迭代器作为其基础迭代器,通过对 ++ 和 -- 运算符进行重载,使得

  • 当反向迭代器进行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器。

  • 当反向迭代器进行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。

反向迭代器以类模板的形式定义在 头文件中,并位于 std 命名空间中。

template  class reverse_iterator;


二、模拟实现

#pragma once

namespace yzz
{
	template
	class reverse_iterator
	{
		typedef reverse_iterator self;
	public:
		reverse_iterator() 
		{ }

		reverse_iterator(Iterator it) : _it(it) 
		{ }

		reverse_iterator(const self& rit) : _it(rit._it) 
		{ }

		Iterator base() const 
		{ 
			return _it; 
		}

		Ref operator*() const
		{
			Iterator tmp = _it;
			return *--tmp;
		}

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

		self& operator++()
		{
			--_it;
			return *this;
		}

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

		self& operator--()
		{
			++_it;
			return *this;
		}

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

		bool operator==(const self& rit) const
		{
			return _it == rit._rit;
		}

		bool operator!=(const self& rit) const
		{
			return _it != rit._it;
		}
	private:
		Iterator _it;
	};
}

2.1 - operator*

通过对源码的剖析,我们可以发现 vector 容器和 list 容器的成员函数 rebegin 以及 rend 的实现是一样的,即

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

详解反向迭代器适配器_第1张图片

所以在重载反向迭代器的解引用运算符 * 时,不能直接返回,即 return *_it;,而应该是 Iterator tmp = _it; return *--tmp;

2.2 - vector 和 list 的反向迭代器

vector 和 list 的反向迭代器实现也是一样的,即

typedef reverse_iterator const_reverse_iterator;
typedef reverse_iterator reverse_iterator;

你可能感兴趣的:(C++,c++,学习)