本專欄內容為:C++學習專欄,分為初階和進階兩部分。 通過本專欄的深入學習,你可以了解并掌握C++。
💓博主csdn個人主頁:小小unicorn
?專欄分類:C++
🚚代碼倉庫:小小unicorn的代碼倉庫🚚
🌹🌹🌹關注我帶你學習編程知識
STL詳解(八)
- 容器適配器
- stack的模擬實現:
- queue的模擬實現:
容器適配器
stack和queue有一點需要注意的是,雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因為stack和queue只是對其他容器的接口進行了包裝,STL中stack和queue默認使用deque容器。
在stack和queue的類模板聲明當中我們就可以看到,它們的模板參數有兩個,第一個是stack和queue當中所存儲的元素類型,而另一個就是指定使用的容器類型。只不過當我們不指定使用何種容器的情況下,stack和queue都默認使用deque作為指定容器。
理解: 學過數據結構后我們都知道,stack和queue既可以使用順序表實現,也可以使用鏈表實現。
在這里我們若是定義一個stack,并指定使用vector容器,則定義出來的stack實際上就是對vector容器進行了包裝
stack的模擬實現:
知道了容器適配器后,stack的模擬實現就顯得相當簡單,我們只需要調用所指定容器的各個成員函數即可實現stack的各個函數接口。
模擬實現代碼如下:
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();}//獲取棧中有效元素個數size_t size() const{return _con.size();}//判斷棧是否為空bool empty() const{return _con.empty();}//交換兩個棧中的數據void swap(stack<T, Container>& st){_con.swap(st._con);}private:Container _con;};
}
測試一下:
queue的模擬實現:
同樣的方式,我們也是通過調用所指定容器的各個成員函數來實現queue的。
模擬實現代碼如下:
namespace NICO //防止命名沖突
{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();}//獲取隊列中有效元素個數size_t size() const{return _con.size();}//判斷隊列是否為空bool empty() const{return _con.empty();}//交換兩個隊列中的數據void swap(queue<T, Container>& q){_con.swap(q._con);}private:Container _con;};
}
測試一下: