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

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

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

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

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

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

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

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

二. 理解容器適配器

STL的六大組件

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

stack的模擬實現(xiàn)

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

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

namespace nn //命名空間域:防止命名沖突
{
    //多參數(shù)模板
	template<class T, class Container = std::deque<T>>//可以明顯看出stack配接器的底層容器是deque雙端隊列,后面會介紹
	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();
		}
		//獲取棧中有效元素個數(shù)
		size_t size() const
		{
			return _con.size();
		}
		//判斷棧是否為空
		bool empty() const
		{
			return _con.empty();
		}
		//交換兩個棧中的數(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;//將一個類的接口轉(zhuǎn)換成用戶需要的另一種接口,即利用deque容器轉(zhuǎn)換成stack配接器
	};
}

queue的模擬實現(xiàn)

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

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

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

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

stack 和 queue 都不具備迭代器, 因為兩者都不具備遍歷走訪功能,所以自然不需要設計迭代器

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

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

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

底層容器如何傳進去?

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

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

相關文章

  • Qt編寫地圖實現(xiàn)閃爍點圖的示例代碼

    Qt編寫地圖實現(xiàn)閃爍點圖的示例代碼

    閃爍點圖的核心有三個要素,城市的名稱、城市的經(jīng)緯度、對應值的大小,當值越大閃爍點也就越大,本文就來實現(xiàn)一下地圖閃爍點圖,具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • C++棧的數(shù)組實現(xiàn)代碼

    C++棧的數(shù)組實現(xiàn)代碼

    這篇文章主要介紹了C++棧的數(shù)組實現(xiàn)方式,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C++基于Boost庫實現(xiàn)命令行解析

    C++基于Boost庫實現(xiàn)命令行解析

    Boost庫中默認自帶了一個功能強大的命令行參數(shù)解析器,以往我都是自己實現(xiàn)參數(shù)解析的,今天偶爾發(fā)現(xiàn)這個好東西,就來總結(jié)一下參數(shù)解析的基本用法,該庫需要引入program_options.hpp頭文件,即可使用了
    2021-06-06
  • openCV中meanshift算法查找目標的實現(xiàn)

    openCV中meanshift算法查找目標的實現(xiàn)

    本文主要介紹了openCV中meanshift算法查找目標的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Matlab繪制散點密度圖的教程詳解

    Matlab繪制散點密度圖的教程詳解

    這篇文章主要介紹了如何使用MATLAB繪制散點密度圖(二維核密度),文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-02-02
  • C++訪問Redis的mset 二進制數(shù)據(jù)接口封裝方案

    C++訪問Redis的mset 二進制數(shù)據(jù)接口封裝方案

    這篇文章主要介紹了C++訪問Redis的mset 二進制數(shù)據(jù)接口封裝方案的相關資料,需要的朋友可以參考下
    2015-07-07
  • C語言的遞歸函數(shù)詳解

    C語言的遞歸函數(shù)詳解

    這篇文章主要為大家介紹了C語言的遞歸函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 用位圖排序無重復數(shù)據(jù)集實例代碼(C++版)

    用位圖排序無重復數(shù)據(jù)集實例代碼(C++版)

    本文講解如何用位圖排序無重復的數(shù)據(jù)集,我們使用C++實現(xiàn)一下這個方法
    2013-11-11
  • 基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討

    基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討

    本篇文章是對在c中使用ftruncate()前需要fflush(),使用后需要rewind()進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++詳細實現(xiàn)完整圖書管理功能

    C++詳細實現(xiàn)完整圖書管理功能

    隨著網(wǎng)絡技術的高速發(fā)展,計算機應用的普及,利用計算機對圖書館的日常工作進行管理勢在必行,本篇文章涵蓋一個圖書管理系統(tǒng)的全部實現(xiàn)代碼,大家可以查缺補漏,提升水平
    2022-05-05

最新評論

永昌县| 甘泉县| 锡林浩特市| 福安市| 珲春市| 泉州市| 景谷| 修水县| 峨眉山市| 舒兰市| 蒙城县| 湖南省| 霍林郭勒市| 安塞县| 宁国市| 黄山市| 新化县| 兰州市| 沙河市| 赤城县| 浑源县| 客服| 张家口市| 瓦房店市| 沛县| 临汾市| 怀柔区| 宾川县| 佛山市| 绥阳县| 济宁市| 册亨县| 平度市| 襄垣县| 团风县| 阿克苏市| 荣昌县| 荣成市| 安西县| 青阳县| 壤塘县|