【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

文章目录

  • 前言
  • 一、反向迭代器封装(reverseiterator)
    • 1.构造函数
    • 1解引用操作.
    • 3.->运算符重载
    • 4.前置++,后置++
    • 5.前置--,后置--
    • 6.不等号运算符重载
    • 7.完整代码
  • 二、rbegin()以及rend()
    • 1.rbeign()
    • 2.rend()


前言

我们要写出一个通用的反向迭代器模拟而且在保证代码简介不繁琐的的情况下,一定程度上使用我们自己模拟的已经封装好的iterator迭代器可以简化许多步骤,首先我们要知道正向迭代器与反向迭代器在位置上的关系

【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)_第1张图片
【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)_第2张图片

一、反向迭代器封装(reverseiterator)

1.构造函数

Iterator _it;
		ReverseIterator(Iterator it)
		//iterator这里回头传的是正向迭代器
			:_it(it)
		{}

1解引用操作.

typedef ReverseIterator<Iterator, Ref, Ptr> self;
		Ref operator*() {
			Iterator tmp(_it);
			//因为从end()位置开始,所以要先--,
			//获得新的位置,但不改变原来的_it
			//所以建立一个临时对象对其进行--操作
			return *(--tmo);
		}

3.->运算符重载

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

4.前置++,后置++

self& operator++() {
			--_it;
			//举例:从rbegin位置开始,也就是end()位置
			//因为此时的位置无效要前一个位置才有效,所以先前置--
			//反向迭代器的++就是正向迭代器的--
			return *this;
		}
		self operator++(int) {
			self tmp(*this);
			--_it;
			return tmp;
		}

5.前置–,后置–

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

6.不等号运算符重载

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

7.完整代码

namespace simulation {
	template<class Iterator ,class Ref,class Ptr>
	//相当于:
	//typedef ReverseIterator reverseiterator;
	//typedef ReverseIterator const_reverseiterator;
	struct ReverseIterator {
		Iterator _it;
		ReverseIterator(Iterator it)
			:_it(it)
		{}
		typedef ReverseIterator<Iterator, Ref, Ptr> self;
		Ref operator*() {
			Iterator tmp(_it);
			//因为从end()位置开始,所以要先--,
			//获得新的位置,但不改变原来的_it
			//所以建立一个临时对象对其进行--操作
			return *(--tmo);
		}

		self& operator++() {
			--_it;
			//举例:从rbegin位置开始,也就是end()位置
			//因为此时的位置无效要前一个位置才有效,所以先前置--
			//反向迭代器的++就是正向迭代器的--
			return *this;
		}
		self operator++(int) {
			self tmp(*this);
			--_it;
			return tmp;
		}

		self operator--(int) {
			self tmp(*this);
			++_it;
			return tmp;
		}
		self& operator--() {
			++_it;
			return *this;
		}
		Ptr operator->() {
			return &( operator*());
		}

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

	};
}

二、rbegin()以及rend()

//先在vctor或者list的头文件中进行重定义
typedef ReverseIterator<iterator, T&, T*> reverseiterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverseiterator;

1.rbeign()

reverseiterator rbegin() {
			//反向迭代器的开头对正向迭代器末尾进行操作
			return reverseiterator(end());
		}
		const_reverseiterator rbegin()const {
			return const_reverseiterator(end());
		}

2.rend()

reverseiterator rend() {
			return reverseiterator(begin());
		}
		const_reverseiterator rend()const {
			return const_reverseiterator(begin());
		}

你可能感兴趣的:(c++,list,java)