国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

容器適配器---deque和STL ---stack queue priority_queue的模擬實(shí)現(xiàn) C++

這篇具有很好參考價(jià)值的文章主要介紹了容器適配器---deque和STL ---stack queue priority_queue的模擬實(shí)現(xiàn) C++。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、容器適配器

deque原理

deque的缺陷

deque的優(yōu)勢(shì)

二、stack的模擬實(shí)現(xiàn)

?三、queue的模擬實(shí)現(xiàn)

四、優(yōu)先級(jí)隊(duì)列的模擬實(shí)現(xiàn)


一、容器適配器

適配器是一種設(shè)計(jì)模式(設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)),該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。

stack和queue中也可以存放元素,但在STL中并沒(méi)有將其劃分在容器的行列,而是將其稱為容器適配器,這是因?yàn)閟tack和queue只是對(duì)其他容器的接口進(jìn)行了包裝,STL中stack和queue默認(rèn)使用deque。

deque原理

deque(雙端隊(duì)列):是一種雙開(kāi)口的"連續(xù)"空間的數(shù)據(jù)結(jié)構(gòu),雙開(kāi)口的含義是:可以在頭尾兩端進(jìn)行插入和刪除操作,且時(shí)間復(fù)雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高。
但是deque并不是真正連續(xù)的空間,而是由一段段連續(xù)的小空間拼接而成的,實(shí)際deque類似于一個(gè)動(dòng)態(tài)的二維數(shù)組。

deque的缺陷

與vector比較,deque的優(yōu)勢(shì)是:頭部插入和刪除時(shí),不需要搬移元素,效率特別高,而且在擴(kuò)容時(shí),也不需要搬移大量的元素,因此其效率是必vector高的。與list比較,其底層是連續(xù)空間,空間利用率比較高,不需要存儲(chǔ)額外字段。但是,deque有一個(gè)致命缺陷:不適合遍歷,因?yàn)樵诒闅v時(shí),deque的迭代器要頻繁的去檢測(cè)其是否移動(dòng)到某段小空間的邊界,導(dǎo)致效率低下,而序列式場(chǎng)景中,可能需要經(jīng)常遍歷,因此在實(shí)際中,需要線性結(jié)構(gòu)時(shí),大多數(shù)情況下優(yōu)先考慮vector和list,deque的應(yīng)用并不多,而目前能看到的一個(gè)應(yīng)用就是,STL用其作為stack和queue的底層數(shù)據(jù)結(jié)構(gòu)

deque的優(yōu)勢(shì)

stack是一種后進(jìn)先出的特殊線性數(shù)據(jù)結(jié)構(gòu),因此只要具有push_back()和pop_back()操作的線性結(jié)構(gòu),都可以作為stack的底層容器,比如vector和list都可以;queue是先進(jìn)先出的特殊線性數(shù)據(jù)結(jié)構(gòu),只要具有push_back和pop_front操作的線性結(jié)構(gòu),都可以作為queue的底層容器,比如list。但是STL中對(duì)stack和queue默認(rèn)選擇deque作為其底層容器,主要是因?yàn)椋?br> 1. stack和queue不需要遍歷(因此stack和queue沒(méi)有迭代器),只需要在固定的一端或者兩端進(jìn)行操作。
2. 在stack中元素增長(zhǎng)時(shí),deque比vector的效率高(擴(kuò)容時(shí)不需要搬移大量數(shù)據(jù));queue中的元素增長(zhǎng)時(shí),deque不僅效率高,而且內(nèi)存使用率高。
結(jié)合了deque的優(yōu)點(diǎn),而完美的避開(kāi)了其缺陷。
dqque結(jié)論:
1.頭尾的插入刪除非常合適,相比vector和list而言,很適合去做stack和queue的默認(rèn)適配容器
2.中間插入刪除多用list
3.隨機(jī)訪問(wèn)多用vector

二、stack的模擬實(shí)現(xiàn)

用deque做適配器

	template<class T, class container=deque<T>>
	//一般情況下默認(rèn)容器為deque適配
	//queue也是一樣
	//deque優(yōu)點(diǎn):頭尾插刪隨機(jī)訪問(wèn)都行;
	//缺陷:operator[]計(jì)算稍顯復(fù)雜大量使用性能下降
	//中間插入刪除效率不高
	//底層角度迭代器會(huì)很復(fù)雜

template<class T, class container=deque<T>>class stack {
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

		T& top()
		{
			return _con.back();
		}

		const T& top() const
		{
			return _con.back();
		}

		bool empty() const
		{
			return _con.empty();
		}

		size_t size() const
		{
			return _con.size();
		}
	private:
		container _con;
		//vector<T> _con;
	};

?三、queue的模擬實(shí)現(xiàn)

與stack一樣,采用deque做適配器文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-432083.html

	template<class T, class container = deque<T>>
	//適配器不能用vector因?yàn)椴恢С诸^插刪 	
	class queue {
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();
		}

		T& back()
		{
			return _con.back();
		}

		T& front()
		{
			return _con.front();
		}

		const T& back() const
		{
			return _con.back();
		}

		const T& front() const
		{
			return _con.front();
		}

		bool empty() const
		{
			return _con.empty();
		}

		size_t size() const
		{
			return _con.size();
		}
	private:
		container _con;
	};

四、優(yōu)先級(jí)隊(duì)列的模擬實(shí)現(xiàn)

template<class T, class container = vector<T>>
	class priority_queue {
	public :
		//類似于堆

		priority_queue()
		{}
		template <class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				_con.push_back(*first);
				++first;
			}
			//建堆
			for (int i = (_con.size() - 1 - 1) / 2; i >= 0; i--)
			{
				adjust_down(i);
			}
		}
		


		void adjust_up(size_t child)
		{
			//向上調(diào)//O(lgN)
			size_t parent = (child - 1) / 2;
			while (child>0)
			{
				if (_con[child] > _con[parent])
				{
					std::swap(_con[child], _con[parent]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
					break;
			}
		}
		void push(const T& x)
		{//向上調(diào)整
			_con.push_back(x);
			adjust_up(_con.size() - 1);
		}

		void adjust_down(size_t parent)
		{
			//向下調(diào)整
			size_t child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && _con[child + 1] > _con[child])
				{
					child++;
				}

				if (_con[child] > _con[parent])
				{
					std::swap(_con[child], _con[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
					break;
			}
		}
		void pop()
		{
			//向下調(diào)整
			std::swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();

			adjust_down(0);
		}

		const T& top()
		{
			return _con[0];
		}

		bool empty()
		{
			return _con.empty();
		}

		size_t size()
		{
			return _con.size();
		}

	private:
		vector<T> _con;
	};

到了這里,關(guān)于容器適配器---deque和STL ---stack queue priority_queue的模擬實(shí)現(xiàn) C++的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】容器適配器--stack&queue&deque

    【C++】容器適配器--stack&queue&deque

    設(shè)計(jì)模式 設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié),是解決特定問(wèn)題的一系列套路。它不是語(yǔ)法規(guī)定,而是一套用來(lái)提高代碼可用性,可維護(hù)性,可讀性,穩(wěn)健性以及安全性的解決方案 迭代器模式 迭代器模式(Iterator Pattern) :提供

    2023年04月10日
    瀏覽(28)
  • STL: 容器適配器stack 與 queue

    STL: 容器適配器stack 與 queue

    ? 目錄 1.容器適配器 1.1 STL標(biāo)準(zhǔn)庫(kù)中stack和queue的底層結(jié)構(gòu) 1.2 deque的簡(jiǎn)單介紹(了解) 1.2.1 deque的原理介紹 1.2.2 deque的缺陷 1.2.3 為什么選擇deque作為stack和queue的底層默認(rèn)容器 2. stack的介紹和使用 2.1 stack的介紹 ?2.2 stack的使用 2.3 利用deque模擬實(shí)現(xiàn)stack 3.queue的介紹和使用 3.1 queue的

    2024年02月05日
    瀏覽(24)
  • STL容器適配器 -- stack和queue(使用+實(shí)現(xiàn))(C++)

    STL容器適配器 -- stack和queue(使用+實(shí)現(xiàn))(C++)

    棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)+畫圖分析如果對(duì)棧和隊(duì)列的結(jié)構(gòu)不了解的,可以先看該鏈接的內(nèi)容 使用stack時(shí)需要頭文件 #includestack stack是一種容器適配器,用于具有 后進(jìn)先出 (LIFO)的環(huán)境中。只能從容器的一端(棧頂),執(zhí)行刪除、插入和提取操作。 stack是作為容器適配器實(shí)現(xiàn)的,容器

    2024年02月14日
    瀏覽(30)
  • 【STL】容器適配器stack和queue常見(jiàn)用法及模擬實(shí)現(xiàn)

    【STL】容器適配器stack和queue常見(jiàn)用法及模擬實(shí)現(xiàn)

    1.stack介紹及使用 1.1 stack的介紹 stack文檔介紹 stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行元素的插入與提取操作。 stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器是使用特定容器類的封裝對(duì)象作為其基礎(chǔ)容器的類,提供一

    2024年02月06日
    瀏覽(24)
  • 【C++入門到精通】C++入門 —— 容器適配器、stack和queue(STL)

    【C++入門到精通】C++入門 —— 容器適配器、stack和queue(STL)

    文章綁定了VS平臺(tái)下std::stack和std::queue的源碼,大家可以下載了解一下?? 前面我們講了C語(yǔ)言的基礎(chǔ)知識(shí),也了解了一些數(shù)據(jù)結(jié)構(gòu),并且講了有關(guān)C++的命名空間的一些知識(shí)點(diǎn)以及關(guān)于C++的缺省參數(shù)、函數(shù)重載,引用 和 內(nèi)聯(lián)函數(shù)也認(rèn)識(shí)了什么是類和對(duì)象以及怎么去new一個(gè) ‘對(duì)象

    2024年02月12日
    瀏覽(28)
  • 【C++】STL——容器適配器priority_queue(優(yōu)先級(jí)隊(duì)列)詳解 及 仿函數(shù)的介紹和使用

    【C++】STL——容器適配器priority_queue(優(yōu)先級(jí)隊(duì)列)詳解 及 仿函數(shù)的介紹和使用

    這篇文章我們接著上一篇的內(nèi)容,再來(lái)學(xué)一個(gè)STL里的容器適配器—— priority_queue (優(yōu)先級(jí)隊(duì)列) 1.1 priority_queue的介紹 我們上一篇文章學(xué)了 queue (隊(duì)列),那優(yōu)先級(jí)隊(duì)列也是在 queue 里面的: 和 queue 一樣, priority_queue 也是一個(gè)容器適配器,那他和 queue 有什么區(qū)別呢?我們一

    2024年02月07日
    瀏覽(25)
  • [C++] STL_priority_queue(優(yōu)先級(jí)隊(duì)列) 的使用及底層的模擬實(shí)現(xiàn),容器適配器,deque的原理介紹

    [C++] STL_priority_queue(優(yōu)先級(jí)隊(duì)列) 的使用及底層的模擬實(shí)現(xiàn),容器適配器,deque的原理介紹

    priority_queue文檔介紹 翻譯: 1. 優(yōu)先隊(duì)列是一種 容器適配器 ,根據(jù)嚴(yán)格的弱排序標(biāo)準(zhǔn), 它的第一個(gè)元素總是它所包含的元素中最大的。 2. 此上下文類似于 堆 , 在堆中可以隨時(shí)插入元素,并且只能檢索最大堆元素(優(yōu)先隊(duì)列中位于頂部的元素)。 3. 優(yōu)先隊(duì)列被實(shí)現(xiàn)為容器適配

    2024年02月04日
    瀏覽(19)
  • 【C++】容器適配器之priority_queue & 仿函數(shù)

    【C++】容器適配器之priority_queue & 仿函數(shù)

    我們和學(xué)習(xí)之前的容器一樣,可以使用cplusplus官網(wǎng)進(jìn)行學(xué)習(xí):priority_queue文檔介紹 priority_queue(優(yōu)先級(jí)隊(duì)列)是一種容器適配器,它 和queue使用同一個(gè)頭文件,其底層結(jié)構(gòu)是一個(gè)堆,并且默認(rèn)情況下是一個(gè)大根堆,此外,priority_queue也不支持迭代器,這是為了不破壞堆的結(jié)構(gòu)使用

    2024年02月01日
    瀏覽(19)
  • 【C++航海王:追尋羅杰的編程之路】priority_queue(優(yōu)先隊(duì)列) | 容器適配器你知道哪些?

    【C++航海王:追尋羅杰的編程之路】priority_queue(優(yōu)先隊(duì)列) | 容器適配器你知道哪些?

    目錄 1 -?priority_queue的介紹和使用 1.1 -?priority_queue的介紹 1.2 -?priority_queue的使用 1.3 -?priority_queue的模擬實(shí)現(xiàn) 2 - 容器適配器 2.1 - 什么是適配器 2.2 - STL標(biāo)準(zhǔn)庫(kù)中stack和queue的底層結(jié)構(gòu) 2.3 - deque的介紹 2.3.1 - deque的原理介紹 2.3.2 - deque的缺陷 2.4 - 為什么選擇deque作為stack和queue的底

    2024年04月10日
    瀏覽(46)
  • C++初階:容器適配器介紹、stack和queue常用接口詳解及模擬實(shí)現(xiàn)

    C++初階:容器適配器介紹、stack和queue常用接口詳解及模擬實(shí)現(xiàn)

    介紹完了list類的相關(guān)內(nèi)容后:C++初階:適合新手的手撕list(模擬實(shí)現(xiàn)list) 接下來(lái)進(jìn)入新的篇章,stack和queue的介紹以及模擬: stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行元素的插入與提取操作。 stack是作為容器適配器

    2024年02月19日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包