[C++] 逆反復子の詳細な紹介 (リストを例として)

目次

2. すべてのコード

3. デザインアイデア 

1. ディスカッション

2. イテレータのドキュメントに関する詳細 

結論


I.はじめに

通常のイテレータを学習したことがない友人がいる場合は、この記事の通常のイテレータの実装を参照してください。

[STL] リストの使用法とトライアル_基礎的な実装_華国山~~プログラマーのブログ-CSDN ブログ

 リストのソースコードを参照しながら、結果について直接話しましょう. ソースコードは通常の反復子を借用して逆反復子を構築していることがわかりました。

2. すべてのコード

namespace my_list
{
	template <class T>
	struct list_node
	{
		list_node(const T& data = T())
			: _data(data)
			, _next(nullptr)
			, _prv(nullptr)
		{}

		T _data;
		list_node* _next;
		list_node* _prv;
	};

	template <class T, class Ref, class Ptr>
	struct list_iterator
	{
		typedef list_node<T> Node;
		typedef list_iterator< T, Ref, Ptr> iterator;

		Node* _node;

		list_iterator(Node* node)
			: _node(node)
		{}

		bool operator!= (const iterator& it)
		{
			return _node != it._node;
		}

		bool operator==(const iterator& it)
		{
			return _node == it._node;
		}

		iterator& operator++()
		{
			_node = _node->_next;
			return *this;
		}

		iterator& operator--()
		{
			_node = _node->_prv;
			return *this;
		}

		iterator operator++(int)
		{
			iterator tmp(*this);
			_node = _node->_next;
			return *tmp;
		}

		Ptr operator*()
		{
			return _node->_data;

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

	template <class Iterator, class Ref, class Ptr>
	struct _reverse_iterator
	{
		typedef _reverse_iterator<Iterator, Ref, Ptr>  reverse_iterator;

		Iterator _cur;
		
		_reverse_iterator(const Iterator& cur)
			: _cur(cur)
		{}

		reverse_iterator& operator++()
		{
			--_cur;
			return *this;
		}

		reverse_iterator operator++(int)
		{
			reverse_iterator temp(*this);
			--_cur;
			return temp;
		}

		reverse_iterator& operator--()
		{
			++_cur;
			return _cur;
		}

		reverse_iterator operator--(int)
		{
			reverse_iterator temp(*this);
			++_cur;
			return temp;
		}

		// != 
		bool operator!=(const reverse_iterator& end)
		{
			return _cur != end._cur;
		}

		bool operator==(const reverse_iterator&  end)
		{
			return _cur == end._cur;
		}

		// *     
		Ptr operator*() 
		{
			auto tmp = _cur;
			--tmp;
			return *tmp;
		}

		// ->
		Ref operator->()
		{
			return &(operator*());
		}
	};

	template <class T>
	class list
	{
		typedef list_node<T> Node;
	public:
		typedef list_iterator<T, T*, T&>  iterator;
		typedef list_iterator<T, const T*, const T&> const_iterator;

		typedef _reverse_iterator<iterator, T*, T&> reverse_iterator;
		typedef _reverse_iterator<const_iterator, const T*, const T&> const_reverse_iterator;

		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());
		}


		iterator begin()
		{
			return iterator(_head->_next);
		}

		iterator end()
		{
			return iterator(_head);
		}

		const_iterator begin() const
		{
			return const_iterator(_head->_next);
		}

		const_iterator end() const
		{
			return const_iterator(_head);
		}
..... //list其他成员函数这里就不再赘述了

3. デザインアイデア 

設計思想は比較的単純で、本質的には通常のイテレータを再利用する関数であり、他のオーバーロード関数の考え方も通常の関数と同様です。

しかし、ここにはより芸術的なデザインもあります。

1. ディスカッション

それでは、ここでこの逆反復子をベクトルで使用できるかについて説明しましょう。? 答えは「はい」です

写真を見てください:

結論: 逆反復子:反復子用のアダプター。

2. イテレータのドキュメントに関する詳細 

すべての容器が適切ですか? 

コンテナの通常のイテレータは少なくとも ++、-- インターフェイスをサポートする必要があるため、必ずしも必要ではありません (例: foward_list は -- をサポートしていないため、リバース イテレータはありません)。

[STL] ドキュメントの使用に関するいくつかの追加を次に示します。これらはイテレータ関数の観点から 3 つのカテゴリに分類されます。

1. forward_iterator (一方向反復子) は、foward_list などの --> ++ をサポートします。

2. bidirection_iterator (双方向反復子) --> ++ -- 例: list など。

3. radom_access_iterator (ランダム反復子) --> ++ -- + - 例:vector、deque など。3 番目の反復子は 1 と 2 の型を継承します。

どのような意味です??

意味: イテレータを使用する場合、インターフェイスは適切なイテレータ タイプの入力を求めるプロンプトを表示します。

 

結論

   このセクションは以上です。閲覧していただきありがとうございます。ご提案がございましたら、コメント欄に残してください。お友達に何かを持っていく場合は、「いいね!」を残してください。あなたの「いいね!」と注目がブログ投稿になります。メイン創造の原動力

おすすめ

転載: blog.csdn.net/qq_72112924/article/details/132694812