華為手機(jī)網(wǎng)站建設(shè)策劃方案論文班級(jí)優(yōu)化大師怎么用
本專欄內(nèi)容為:C++學(xué)習(xí)專欄,分為初階和進(jìn)階兩部分。 通過(guò)本專欄的深入學(xué)習(xí),你可以了解并掌握C++。
💓博主csdn個(gè)人主頁(yè):小小unicorn
?專欄分類(lèi):C++
🚚代碼倉(cāng)庫(kù):小小unicorn的代碼倉(cāng)庫(kù)🚚
🌹🌹🌹關(guān)注我?guī)銓W(xué)習(xí)編程知識(shí)
STL詳解(八)
- 容器適配器
- stack的模擬實(shí)現(xiàn):
- queue的模擬實(shí)現(xiàn):
容器適配器
stack和queue有一點(diǎn)需要注意的是,雖然stack和queue中也可以存放元素,但在STL中并沒(méi)有將其劃分在容器的行列,而是將其稱為容器適配器,這是因?yàn)閟tack和queue只是對(duì)其他容器的接口進(jìn)行了包裝,STL中stack和queue默認(rèn)使用deque容器。
在stack和queue的類(lèi)模板聲明當(dāng)中我們就可以看到,它們的模板參數(shù)有兩個(gè),第一個(gè)是stack和queue當(dāng)中所存儲(chǔ)的元素類(lèi)型,而另一個(gè)就是指定使用的容器類(lèi)型。只不過(guò)當(dāng)我們不指定使用何種容器的情況下,stack和queue都默認(rèn)使用deque作為指定容器。
理解: 學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)后我們都知道,stack和queue既可以使用順序表實(shí)現(xiàn),也可以使用鏈表實(shí)現(xiàn)。
在這里我們?nèi)羰嵌x一個(gè)stack,并指定使用vector容器,則定義出來(lái)的stack實(shí)際上就是對(duì)vector容器進(jìn)行了包裝
stack的模擬實(shí)現(xiàn):
知道了容器適配器后,stack的模擬實(shí)現(xiàn)就顯得相當(dāng)簡(jiǎn)單,我們只需要調(diào)用所指定容器的各個(gè)成員函數(shù)即可實(shí)現(xiàn)stack的各個(gè)函數(shù)接口。
模擬實(shí)現(xiàn)代碼如下:
namespace NIC //防止命名沖突
{template<class T, class Container = std::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();}//獲取棧中有效元素個(gè)數(shù)size_t size() const{return _con.size();}//判斷棧是否為空bool empty() const{return _con.empty();}//交換兩個(gè)棧中的數(shù)據(jù)void swap(stack<T, Container>& st){_con.swap(st._con);}private:Container _con;};
}
測(cè)試一下:
queue的模擬實(shí)現(xiàn):
同樣的方式,我們也是通過(guò)調(diào)用所指定容器的各個(gè)成員函數(shù)來(lái)實(shí)現(xiàn)queue的。
模擬實(shí)現(xiàn)代碼如下:
namespace NICO //防止命名沖突
{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;};
}
測(cè)試一下: