[C++] The simulation implementation of the reverse iterator is universal (can be applied to vector, string, list and other simulation containers)


foreword

We want to write a general reverse iterator simulation and in the case of ensuring that the code introduction is not cumbersome, to a certain extent, using our own simulated encapsulated iterator iterator can simplify many steps. First of all, we need to know the forward Positional relationship between iterators and reverse iterators

insert image description here
insert image description here

1. Reverse iterator encapsulation (reverseiterator)

1. Constructor

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

1 Dereference operation.

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

3. -> Operator overloading

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

4. Front ++, post ++

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

5. Front –, Rear –

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

6. Inequality operator overloading

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

7. Complete code

namespace simulation {
    
    
	template<class Iterator ,class Ref,class Ptr>
	//相当于:
	//typedef ReverseIterator<iterator, T&, T*> reverseiterator;
	//typedef ReverseIterator<const_iterator, const T&, const T*> 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;
		}

	};
}

Two, rbegin () and 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());
		}

Guess you like

Origin blog.csdn.net/m0_74774759/article/details/132005004