C++容器適配器的概念與示例
一. 什么是適配器與容器適配器?
適配器是一種設(shè)計(jì)模式(設(shè)計(jì)模式是一套被反復(fù)使用的,多數(shù)人知曉的,經(jīng)過分類編目的,代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)),該種模式將一個(gè)類的接口轉(zhuǎn)換成用戶需要的另外一個(gè)接口。
舉個(gè)例子:在日常生活中,當(dāng)手機(jī)沒電了,我們需要給手機(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ì)列,通過這三個(gè)結(jié)構(gòu),我們可以更好的理解容器適配器的用途。
二. 理解容器適配器
STL的六大組件

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


stack的模擬實(shí)現(xiàn)
知道了容器適配器后,stack的模擬實(shí)現(xià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)
同樣的方式,我們也是通過調(diào)用所指定容器的各個(gè)成員函數(shù)來實(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt編寫地圖實(shí)現(xiàn)閃爍點(diǎn)圖的示例代碼
閃爍點(diǎn)圖的核心有三個(gè)要素,城市的名稱、城市的經(jīng)緯度、對應(yīng)值的大小,當(dāng)值越大閃爍點(diǎn)也就越大,本文就來實(shí)現(xiàn)一下地圖閃爍點(diǎn)圖,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
openCV中meanshift算法查找目標(biāo)的實(shí)現(xiàn)
本文主要介紹了openCV中meanshift算法查找目標(biāo)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++訪問Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案
這篇文章主要介紹了C++訪問Redis的mset 二進(jìn)制數(shù)據(jù)接口封裝方案的相關(guān)資料,需要的朋友可以參考下2015-07-07
用位圖排序無重復(fù)數(shù)據(jù)集實(shí)例代碼(C++版)
本文講解如何用位圖排序無重復(fù)的數(shù)據(jù)集,我們使用C++實(shí)現(xiàn)一下這個(gè)方法2013-11-11
基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討
本篇文章是對在c中使用ftruncate()前需要fflush(),使用后需要rewind()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++詳細(xì)實(shí)現(xiàn)完整圖書管理功能
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對圖書館的日常工作進(jìn)行管理勢在必行,本篇文章涵蓋一個(gè)圖書管理系統(tǒng)的全部實(shí)現(xiàn)代碼,大家可以查缺補(bǔ)漏,提升水平2022-05-05

