最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?STL反向迭代器的實(shí)現(xiàn)

 更新時(shí)間:2022年07月26日 11:43:52   作者:酬?勤  
本文主要介紹了C++?STL反向迭代器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

反向迭代器其實(shí)就行對(duì)正向迭代器進(jìn)行封裝,源生迭代器,為了實(shí)現(xiàn)運(yùn)算符的結(jié)果不同,正向迭代器也對(duì)源生迭代器進(jìn)行了封裝。

反向迭代器的適配器,就是 Iterator是哪個(gè)容器的迭代器,reverse_iterator < Iterator >就可以 適配出哪個(gè)容器的反向迭代器。復(fù)用的體現(xiàn)。

反向迭代器適配器結(jié)構(gòu):

	template <class Iterator, class Ref, class Ptr>
	class reverse_iterator
	{
		typedef reverse_iterator<Iterator, Ref, Ptr> self;
	public:
	// 重載運(yùn)算符函數(shù)
	private:
		Iterator _it;
	};

源碼容器獲取迭代器時(shí)具體情況,如圖:

在這里插入圖片描述

我們以為的情況:

在這里插入圖片描述

這是源碼里的實(shí)現(xiàn)的大概情況,begin()與rend()對(duì)稱,end()與rbegin()對(duì)稱。這與我們想的不一樣,所以反向迭代器適配器內(nèi)部實(shí)現(xiàn)的也有所不一樣。例如:
如果我們按照源碼的思路寫,反向迭代器里封裝了一個(gè)正向迭代器_it,正常的++,–等操作只需要調(diào)用_it的–,++運(yùn)算符重載函數(shù)即可。除了,operator*需要特寫,如下代碼:

		Ref operator*()
		{
			//正常思路
			//return *_it;
			// 源碼思路
			Iterator prev = _it;
			return *--prev;
		}

正常情況是解引用迭代器,但是源碼的思路是往后一個(gè)位置的迭代器才是。這也是因?yàn)閞begin,和rend實(shí)現(xiàn)的原因?qū)е碌摹?/p>

適配出來(lái)的反向迭代器其用法和正向迭代器一樣;

反向迭代器根正向迭代器區(qū)別就是++、–的方向是相反的所以反向迭代器封裝正向迭代器即可,重載控制++、–的方向。
源碼的設(shè)計(jì)追求對(duì)稱,我們?cè)O(shè)計(jì)可以不按源碼走,在容器實(shí)現(xiàn)rbegin(),rend()時(shí),要按照反向迭代器的設(shè)計(jì)風(fēng)格去實(shí)現(xiàn)。

list完整樣例:

1、反向迭代器適配器

	// Iterator是哪個(gè)容器的迭代器,reverse_iterator<Iterator>就可以
	// 適配出哪個(gè)容器的反向迭代器。復(fù)用的體現(xiàn)
	template <class Iterator, class Ref, class Ptr>
	class reverse_iterator
	{
		typedef reverse_iterator<Iterator, Ref, Ptr> self;
	public:
		reverse_iterator(Iterator it)
			:_it(it)
		{}

		Ref operator*()
		{
			//正常思路
			//return *_it;
			Iterator prev = _it;
			return *--prev;
		}

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

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

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

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

	private:
		Iterator _it;// 封裝任何類型的正向迭代器
	};

二、list 正向迭代器

	// iterator -> 類去分裝節(jié)點(diǎn)指針,重載*、++ 等運(yùn)算符,讓它們像指針一樣使用
	template<class T,class Ref,class Ptr>
	class _list_iterator
	{
	public:
		typedef _list_iterator < T, Ref,Ptr> self;
		typedef ListNode<T> Node;
		_list_iterator( Node* x)
			:_node(x)
		{}
		// ++it
		self& operator++()
		{
			_node = _node->_next;
			return *this;
		}

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

		// --it
		self& operator--()
		{
			_node = _node->_pre;
			return *this;
		}

		// it--
		self operator--(int)
		{
			self tmp(*this);
			_node = _node->_pre;
			return tmp;
		}

		//*
		Ref operator*()
		{
			return _node->_data;
		}
		//->
		Ptr operator->()
		{
			return &(_node->_data);
		}
		//!=
		bool operator!=(const self& x)
		{
			return _node != x._node;
		}
		//==
		bool operator==(const self& x)
		{
			return _node == x._node;
		}

		Node* _node;
	};

三、 list容器
注意:這里只涉及反向迭代器的內(nèi)容

template<class T>
	class list
	{
	public:
		typedef ListNode<T> Node;
		typedef _list_iterator<T, T&, T*> iterator;
		typedef _list_iterator<T, const T&, const T*> const_iterator;
		typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
		typedef reverse_iterator<iterator, T&, T*> 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()
		{
			_head= new Node();
			_head->_next = _head;
			_head->_pre = _head;
		}
		

		void push_back(const T&x)
		{
			Node* newnode = new Node(x);
			Node* tail = _head->_pre;
			newnode-> _pre = tail;
			tail->_next = newnode;
			newnode->_next = _head;
			_head->_pre = newnode;
		}

	private:
		Node* _head;// 頭結(jié)點(diǎn)指針
	};

測(cè)試代碼:

	void test11()
	{
		BBQ::list<int> L1;
		L1.push_back(1);
		L1.push_back(2);
		L1.push_back(3);
		reverse_print_list(L1);
	}

到此這篇關(guān)于C++ STL反向迭代器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ STL反向迭代器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++類繼承時(shí)的構(gòu)造函數(shù)

    C++類繼承時(shí)的構(gòu)造函數(shù)

    這篇文章主要介紹了C++類繼承時(shí)的構(gòu)造函數(shù),C++中,子類繼承父類除去構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員。因此,子類需要編寫自己的構(gòu)造函數(shù)和析構(gòu)函數(shù)。更多相關(guān)詳情需要的小伙伴可以參考下面文章介紹
    2022-03-03
  • 淺談C++中字符串輸入get與getline的區(qū)別

    淺談C++中字符串輸入get與getline的區(qū)別

    這篇文章主要介紹了C++中字符串輸入get與getline的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 基于C語(yǔ)言實(shí)現(xiàn)推箱子游戲

    基于C語(yǔ)言實(shí)現(xiàn)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • VC中CWinThread類以及和createthread API的區(qū)別分析

    VC中CWinThread類以及和createthread API的區(qū)別分析

    這篇文章主要介紹了VC中CWinThread類以及和createthread API的區(qū)別分析,較為詳細(xì)的講述了CWinThread類的原理,并以實(shí)例形式對(duì)AfxBeginThread函數(shù)的內(nèi)部實(shí)現(xiàn)進(jìn)行了解釋說(shuō)明,需要的朋友可以參考下
    2014-10-10
  • 利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的完整代碼

    利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的完整代碼

    通訊錄是一個(gè)可以記錄親人、好友信息的工具,下面這篇文章主要給大家介紹了關(guān)于利用C++實(shí)現(xiàn)通訊錄管理系統(tǒng)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言規(guī)律循環(huán)累加求和案例

    C語(yǔ)言規(guī)律循環(huán)累加求和案例

    這篇文章主要介紹了C語(yǔ)言規(guī)律循環(huán)累加求和案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 深入理解c++常成員函數(shù)和常對(duì)象

    深入理解c++常成員函數(shù)和常對(duì)象

    下面小編就為大家?guī)?lái)一篇深入理解c++常成員函數(shù)和常對(duì)象。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • c語(yǔ)言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子

    c語(yǔ)言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子

    c語(yǔ)言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子,需要的朋友可以參考一下
    2013-03-03
  • C++遞歸實(shí)現(xiàn)螺旋數(shù)組的實(shí)例代碼

    C++遞歸實(shí)現(xiàn)螺旋數(shù)組的實(shí)例代碼

    這篇文章主要介紹了C++遞歸實(shí)現(xiàn)螺旋數(shù)組的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C++ 頭文件系列(set)詳解

    C++ 頭文件系列(set)詳解

    一般而言,每個(gè)C++/C程序通常由頭文件和定義文件組成。頭文件作為一種包含功能函數(shù)、數(shù)據(jù)接口聲明的載體文件,主要用于保存程序的聲明,而定義文件用于保存程序的實(shí)現(xiàn) 。
    2017-02-02

最新評(píng)論

监利县| 交城县| 吐鲁番市| 同仁县| 革吉县| 鲁甸县| 嵊州市| 定陶县| 岗巴县| 阜南县| 中方县| 易门县| 巴里| 广安市| 乌恰县| 大同市| 丰台区| 梁山县| 永春县| 松桃| 延寿县| 万载县| 洪江市| 吉水县| 长泰县| 宝山区| 互助| 都江堰市| 广昌县| 图片| 凤凰县| 榆树市| 凯里市| 阿拉善右旗| 稻城县| 黑龙江省| 剑河县| 本溪市| 镇平县| 张北县| 平和县|