[C++] Имитационная реализация обратного итератора универсальна (может применяться к вектору, строке, списку и другим контейнерам моделирования).


предисловие

Мы хотим написать общую симуляцию обратного итератора, и в случае обеспечения того, чтобы введение кода не было громоздким, в определенной степени использование нашего собственного смоделированного инкапсулированного итератора может упростить многие шаги.Прежде всего, нам нужно знать прямой Позиционные отношения между итераторами и обратными итераторами

вставьте сюда описание изображения
вставьте сюда описание изображения

1. Инкапсуляция обратного итератора (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<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;
		}

	};
}

Два, 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.ренд()

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

Je suppose que tu aimes

Origine blog.csdn.net/m0_74774759/article/details/132005004
conseillé
Classement