欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++容器適配器的概念與示例

 更新時(shí)間:2023年01月14日 09:11:33   作者:SouLinya  
C++?STL(標(biāo)準(zhǔn)模板庫(kù))是一套功能強(qiáng)大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實(shí)現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊(duì)列、棧,今天我們來(lái)探究一下stl容器適配器的使用吧

一. 什么是適配器與容器適配器?

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

舉個(gè)例子:在日常生活中,當(dāng)手機(jī)沒(méi)電了,我們需要給手機(jī)充電,給手機(jī)充電的方式很多,可以插到電源上,也可以用充電寶,還可以直接連著電腦充。而我們并不關(guān)心用什么給它充電,我們關(guān)心的只是能否給手機(jī)充上電。適配器充當(dāng)?shù)慕巧褪?給手機(jī)充電的接口,它會(huì)將不同大小的電壓轉(zhuǎn)化成適合給手機(jī)充電的電壓。容器適配器的概念可以結(jié)合這個(gè)例子理解,它以 某種容器作為底層結(jié)構(gòu),改變其接口,使它符合該容器的特性。

容器適配器:以某種已有的既定容器作為底層結(jié)構(gòu),在其基礎(chǔ)上進(jìn)一步地進(jìn)行封裝接口函數(shù)。使其可以滿足某種特性。

下面將介紹三個(gè)用到容器適配器的結(jié)構(gòu):stack棧,queue隊(duì)列,priority_queue優(yōu)先級(jí)隊(duì)列,通過(guò)這三個(gè)結(jié)構(gòu),我們可以更好的理解容器適配器的用途。

二. 理解容器適配器

STL的六大組件

我們可以看出雖然stack,queue,priority_queue中也可以存放數(shù)據(jù),但在STL中并沒(méi)有將其劃分在容器的行列,而是將其稱為容器配接器,這是因?yàn)閟tack,queue,priority_queue只是對(duì)其它容器的接口進(jìn)行了包裝,STL中stack和queue默認(rèn)使用deque,priority_queue默認(rèn)使用vector作為容器。我們現(xiàn)在來(lái)看看它們的底層接口和實(shí)現(xiàn)

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

知道了容器適配器后,stack的模擬實(shí)現(xiàn)就簡(jiǎn)單了,我們只需要調(diào)用指定容器deque的各個(gè)成員函數(shù)即可實(shí)現(xiàn)stack的各個(gè)函數(shù)接口。

底層實(shí)現(xiàn)代碼如下:stack底層利用deque雙端隊(duì)列進(jìn)行包裝,需要更改成多參數(shù)模板,最便利的一點(diǎn)就是,stack的底層函數(shù)的實(shí)現(xiàn)可以直接調(diào)用容器的函數(shù)接口,不需要自己再一步步實(shí)現(xiàn)。

namespace nn //命名空間域:防止命名沖突
{
    //多參數(shù)模板
	template<class T, class Container = std::deque<T>>//可以明顯看出stack配接器的底層容器是deque雙端隊(duì)列,后面會(huì)介紹
	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//const修飾
		{
			return _con.back();
		}
		//獲取棧中有效元素個(gè)數(shù)
		size_t size() const
		{
			return _con.size();
		}
		//判斷棧是否為空
		bool empty() const
		{
			return _con.empty();
		}
		//交換兩個(gè)棧中的數(shù)據(jù)
		void swap(stack<T, Container>& st)//注意stack<T,Container>才是類型,加引用,別名,減少拷貝
		{
			_con.swap(st._con);//調(diào)用deque的算法swap
		}
	private:
	    //deque<T> _con底層
		Container _con;//將一個(gè)類的接口轉(zhuǎn)換成用戶需要的另一種接口,即利用deque容器轉(zhuǎn)換成stack配接器
	};
}

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

同樣的方式,我們也是通過(guò)調(diào)用所指定容器的各個(gè)成員函數(shù)來(lái)實(shí)現(xiàn)queue的。

底層實(shí)現(xiàn)代碼如下:

namespace nn //防止命名沖突
{
	template<class T, class Container = std::deque<T>>
	class queue
	{
	public:
		//隊(duì)尾入隊(duì)列
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//隊(duì)頭出隊(duì)列
		void pop()
		{
			_con.pop_front();
		}
		//獲取隊(duì)頭元素
		T& front()
		{
			return _con.front();
		}
		const T& front() const
		{
			return _con.front();
		}
		//獲取隊(duì)尾元素
		T& back()
		{
			return _con.back();
		}
		const T& back() const
		{
			return _con.back();
		}
		//獲取隊(duì)列中有效元素個(gè)數(shù)
		size_t size() const
		{
			return _con.size();
		}
		//判斷隊(duì)列是否為空
		bool empty() const
		{
			return _con.empty();
		}
		//交換兩個(gè)隊(duì)列中的數(shù)據(jù)
		void swap(queue<T, Container>& q)
		{
			_con.swap(q._con);
		}
	private:
		Container _con;//deque<T> _con;
	};
}

思考stack 和 queue 是否存在迭代器?

stack 和 queue 都不具備迭代器, 因?yàn)閮烧叨疾痪邆浔闅v走訪功能,所以自然不需要設(shè)計(jì)迭代器

stack 和 queue可以以哪些容器作為底層容器?

實(shí)際上stack使用vector作為底層容器也是可以的,queue使用deque雙端隊(duì)列+list帶頭雙向循環(huán)鏈表作為底層容器也是可以的。

但是deque在設(shè)計(jì)上相比于list和vector,作為stack,queue的底層結(jié)構(gòu)更優(yōu)。

底層容器如何傳進(jìn)去?

作為模板參數(shù)傳入template<class T,class Container = deque<T>>,用了默認(rèn)參數(shù)(缺省參數(shù))

到此這篇關(guān)于C++容器適配器的概念與示例的文章就介紹到這了,更多相關(guān)C++容器適配器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

    C++實(shí)現(xiàn)單置換密碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)單置換密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 詳解基于Matlab的空心散點(diǎn)檢測(cè)

    詳解基于Matlab的空心散點(diǎn)檢測(cè)

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)空心散點(diǎn)檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,感興趣的可以跟隨小編了解一下
    2022-02-02
  • C++中fstream,ifstream及ofstream用法淺析

    C++中fstream,ifstream及ofstream用法淺析

    這篇文章主要介紹了C++中fstream,ifstream及ofstream用法,適合C++初學(xué)者學(xué)習(xí)文件流的操作,需要的朋友可以參考下
    2014-08-08
  • C++逆向分析移除鏈表元素實(shí)現(xiàn)方法詳解

    C++逆向分析移除鏈表元素實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(203.移除鏈表元素),本篇文章通過(guò)逆向分析的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2022-11-11
  • C語(yǔ)言實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    C語(yǔ)言實(shí)現(xiàn)音樂(lè)播放器的示例代碼

    這篇文章主要和大家分享了一個(gè)C語(yǔ)言的小DEMO,可以實(shí)現(xiàn)音樂(lè)播放器功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02
  • C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解

    C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解

    C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C 的結(jié)構(gòu)體內(nèi)存對(duì)齊
    2022-05-05
  • C++?QT實(shí)現(xiàn)獲取本機(jī)網(wǎng)卡信息

    C++?QT實(shí)現(xiàn)獲取本機(jī)網(wǎng)卡信息

    這篇文章主要為大家詳細(xì)介紹了如何利用qt自帶的QNetworkInterface接口以及c++Iphlpapi庫(kù),獲取當(dāng)前windows電腦下的網(wǎng)卡信息,需要的可以參考下
    2024-01-01
  • C++11中的stoi & stod用法

    C++11中的stoi & stod用法

    這篇文章主要介紹了C++11中的stoi & stod用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C語(yǔ)言實(shí)現(xiàn)520表白代碼 祝你表白成功!

    C語(yǔ)言實(shí)現(xiàn)520表白代碼 祝你表白成功!

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)520表白代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論