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

【C++】STL之容器適配器——使用deque適配stack和queue

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

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque

個(gè)人主頁:??在肯德基吃麻辣燙
分享一句喜歡的話:熱烈的火焰,冰封在最沉默的火山深處。


前言

本文章主要介紹容器適配器的功能,以及一個(gè)適配的場(chǎng)景。


一、什么是容器適配器?

容器適配器,按字面意思理解的話,就是用來對(duì)一個(gè)容器進(jìn)行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

而在C++STL中不把stack和queue納入容器的范圍而是納入容器適配器的范圍是因?yàn)椋?/p>

stack和queue沒有下標(biāo)隨機(jī)訪問等操作,只有普通的pop_front,push_back,pop_back()等操作,而這些函數(shù)在其他容器中完全可以有,棧和隊(duì)列的實(shí)現(xiàn)完全可以將其他容器的操作進(jìn)行復(fù)用,這就是stack和queue作為容器適配器的原因。
至于為什么用deque(雙端隊(duì)列)作為stack和queue的默認(rèn)適配容器,先看一看stack和queue的基本函數(shù)使用。

二、stack的基本函數(shù)和模擬實(shí)現(xiàn)

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque可以看到在stl庫(kù)開放的棧的接口中,僅有寥寥無幾的幾個(gè)接口,主要為:push,pop,size,empty,top。

由于棧的后進(jìn)先出的特性,

  • 1.push是往棧頂進(jìn)行push元素。
  • 2.pop是刪除棧頂元素。
  • 3.size是計(jì)算當(dāng)前的棧有多少元素
  • 4.empty是判斷棧是否為空
  • 5.top是取棧頂元素

這幾個(gè)函數(shù)完全可以復(fù)用其他容器的函數(shù)。
所以棧其實(shí)可以用vector,list等容器進(jìn)行適配。

下面來模擬實(shí)現(xiàn):

namespace dzt
{
	template<class T, class container = deque<T> >
	class stack
	{
	public:

		void push(const T& x)
		{
			_con.push_back(x);
		}

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

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

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

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


	private:
		container _con;
	};
}

為了和庫(kù)里面的stack不沖突,這里給了一個(gè)命名空間域dzt作為限定。

三、queue的基本函數(shù)和模擬實(shí)現(xiàn)

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque
與stack類似,主要的函數(shù)有:
push,pop,front,back,size,empty。
由于隊(duì)列先進(jìn)先出的特性

  • 1.push,向隊(duì)列尾部插入元素
  • 2.pop,刪除隊(duì)頭元素
  • 3.front,取隊(duì)頭元素
  • 4.back,取隊(duì)尾元素
  • 5.size,計(jì)算當(dāng)前隊(duì)列的元素個(gè)數(shù)
  • 6.empty,判斷當(dāng)前隊(duì)列是否為空

下面來模擬實(shí)現(xiàn)queue

namespace dzt
{

	template<class T, class container = deque<T> >
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.insert(_con.end(),x);
		}
		void pop()
		{
			_con.erase(_con.begin());
		}

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

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

		//取隊(duì)頭
		T& front()
		{
			return _con.front();
		}
		
		//取隊(duì)尾
		T& back()
		{
			return _con.back();
		}
	private:
		container _con;
	};
}

四、deque

4.1deque的底層結(jié)構(gòu)

deque(雙端隊(duì)列):是一種雙開口的"連續(xù)"空間的數(shù)據(jù)結(jié)構(gòu),雙開口的含義是:可以在頭尾兩端進(jìn)行插入和刪除操作,且時(shí)間復(fù)雜度為O(1),與vector比較,頭插效率高,不需要搬移元素;與list比較,空間利用率比較高。

deque并不是真正連續(xù)的空間,而是由一段段連續(xù)的小空間拼接而成的,實(shí)際deque類似于一個(gè)動(dòng)態(tài)的二維數(shù)組

deque的底層結(jié)構(gòu)如下:

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque

  • 1.使用一個(gè)中控指針數(shù)組來存儲(chǔ)各個(gè)位置的指針,而存儲(chǔ)的位置一般只在數(shù)組的中間部分,大多數(shù)指針指向的內(nèi)容都是一小塊連續(xù)的空間,并且這些連續(xù)的空間的大小都是一樣的。
    • start(iterator)記錄頭部數(shù)據(jù),finish(iterator)記錄尾部數(shù)據(jù),頭尾的插入刪除效率非常高,O(1)。

【C++】STL之容器適配器——使用deque適配stack和queue,C++,c++,開發(fā)語言,STL,Deque,deque

  • cur記錄指向的連續(xù)空間的第一個(gè)位置,first和last是該空間的區(qū)間,node反指回中控?cái)?shù)組,方便找到下一個(gè)連續(xù)空間。

但是deque也有缺點(diǎn),雖然它重載了[]訪問,但是在訪問中間元素時(shí)不夠極致,需要進(jìn)行計(jì)算。假設(shè)給定的下標(biāo)為i,計(jì)算過程如下:

  • 1.i如果在第一個(gè)數(shù)組的范圍,直接訪問
  • 2.如果不在,i-=第一個(gè)數(shù)組的size
  • i/buffersize = 第i個(gè)數(shù)組的位置
  • 此時(shí)i指向了第i個(gè)數(shù)組,再用i/buffersize = 第i個(gè)位置的元素。

相比于vector,deque的下標(biāo)訪問的效率不夠高,
相比于list,deque的中間位置插入刪除效率不夠高。

4.2使用deque適配stack和queue的原因

  • deque作為棧和隊(duì)列的容器適配器而不是用vector/list的優(yōu)點(diǎn):
  • 1.deque的底層結(jié)構(gòu)是使用中控指針數(shù)組來存儲(chǔ)頭和尾等各個(gè)空間的地址,對(duì)頭尾的插入刪除效率極高O(1)
  • 2.棧就需要push_back()和pop_back(),隊(duì)列需要支持pop_front()和push_back() ——— 戰(zhàn)勝了vector
  • 3.每一小塊空間都是連續(xù)的,可以提高cpu高速緩存加載的效率。 ————戰(zhàn)勝了list
  • 4.stack和queue都不需要[]隨機(jī)訪問,而deque的缺陷就是下標(biāo)隨機(jī)訪問的效率不夠高
  • 5.這樣棧和隊(duì)列的需求完美迎合了deque的優(yōu)點(diǎn),避開了deque的缺點(diǎn)

總結(jié)

本篇文章簡(jiǎn)單講述了deque容器的底層原理以及相比于vector和list的缺點(diǎn),還有用deque作為stack和queue的適配器的原因。文章來源地址http://www.zghlxwxcb.cn/news/detail-602979.html

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

本文來自互聯(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)文章

  • STL stack,queue,deque以及適配器

    STL stack,queue,deque以及適配器

    下面是stack庫(kù)中的接口函數(shù),有了前面的基礎(chǔ),我們可以根據(jù)函數(shù)名得知函數(shù)的作用 函數(shù) 說明 stack() 構(gòu)造空棧 empty() 判斷棧是否為空 size() 返回棧中元素個(gè)數(shù) top 返回棧頂元素 push() 將值從棧頂壓入棧內(nèi) pop() 在棧頂出棧 棧其實(shí)就是一種特殊的 vector ,因此可以使用 vector 模擬實(shí)

    2024年02月10日
    瀏覽(23)
  • [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++入門到精通】C++入門 —— 容器適配器、stack和queue(STL)

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

    文章綁定了VS平臺(tái)下std::stack和std::queue的源碼,大家可以下載了解一下?? 前面我們講了C語言的基礎(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日
    瀏覽(29)
  • 【C++】STL中的容器適配器 stack queue 和 priority_queue 的模擬實(shí)現(xiàn)

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

    適配器是一種設(shè)計(jì)模式 (設(shè)計(jì)模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)),該種模式是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。 例如我們常見的充電器就是一種適配器,它將我們常用的220V交流電壓轉(zhuǎn)化為4,5V (或者其他更高的電

    2023年04月26日
    瀏覽(24)
  • 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日
    瀏覽(25)
  • 【C++】STL之適配器---用deque實(shí)現(xiàn)棧和隊(duì)列

    【C++】STL之適配器---用deque實(shí)現(xiàn)棧和隊(duì)列

    目錄 前言 一、deque ?1、deque 的原理介紹 ?2、deque 的底層結(jié)構(gòu) ?3、deque 的迭代器 ?4、deque 的優(yōu)缺點(diǎn) ? 4.1、優(yōu)點(diǎn) ? 4.2、缺點(diǎn) 二、stack 的介紹和使用 ?1、stack 的介紹 ?2、stack 的使用 ?3、stack 的模擬實(shí)現(xiàn) 三、queue 的介紹和使用 ?1、queue 的介紹? ?2、queue 的使用 ?3、queue 的模

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

    【STL】容器適配器stack和queue常見用法及模擬實(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++ [STL容器適配器]

    C++ [STL容器適配器]

    本文已收錄至《C++語言》專欄! 作者:ARMCSKGT 前面我們介紹了適配器模式中的反向迭代器,反向迭代器通過容器所支持的正向迭代器適配為具有反向迭代功能的迭代器,本節(jié)我們介紹STL中另一種適配器: 容器適配器 ! 前面我們提到過STL適配器模式,關(guān)于適配器的解釋: S

    2024年02月11日
    瀏覽(25)
  • C++ STL學(xué)習(xí)之【容器適配器】

    C++ STL學(xué)習(xí)之【容器適配器】

    ?個(gè)人主頁: 北 海 ??所屬專欄: C++修行之路 ??每篇一句: 圖片來源 A year from now you may wish you had started today. 明年今日,你會(huì)希望此時(shí)此刻的自己已經(jīng)開始行動(dòng)了。 適配器(配接器)是 STL 中的六大組件之一,扮演著軸承、轉(zhuǎn)換器的角色,使得 STL 中組件的使用更為靈活,

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

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

    這篇文章我們接著上一篇的內(nè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日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包