c++中容器适配器
什么是容器適配器
適配器是一種設計模式(設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結),該中模式是將一個類的接口轉換成客戶希望的另外一個接口。
stack模擬封裝
template<class T,class Container = deque<T>>class stack{public:stack(){}void push(const T& data){_con.push_back(data);}void pop(){_con.pop_back();}size_t size()const{return _con.size();}bool empty()const{return _con.empty();}T& top(){return _con.back();}const T& top()const{return _con.back();}private:Container _con;};queue模擬封裝
template<class T , class Container = deque<T>>class queue{public:queue(){}void push(const T& data){_con.push_back(data);}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();}private:Container _con;};- 每種容器都提供了一組接口,如果容器中的接口不能滿足需求,那么重新編寫容器還是改變我們的需求
- 應該構造一個容器接口到需求接口之間的轉換器,稱為容器適配器。
- 容器適配器將原容器進行了一層封裝,底層基于普通容器,上層對外提供封裝后的新接口,滿足不同使用者的需求。常用的棧stack、隊列deque、優先級隊列priority_queue在STL中都有自己的容器適配器。
- 容器適配器對使用者是個黑盒,使用者無需知道容器適配器封裝的容器類型,而只需了解容器適配器提供的接口。除了使用STL提供的容器適配器,也可以自己構造容器適配器,將STL中的容器進行封裝,對外提供所需的接口。
- 容器適配器可以封裝的容器類型根據容器適配器對外提供的接口和容器適配器的內部算法而定。但是任何容器適配器對底層容器都有一些通用的要求,例如,底層容器必須支持添加刪除 和訪問尾元素操作,因此array不能作為容器適配器的底層容器。
- 棧適配器和隊列適配器默認的底層容器是deque,優先隊列適配器默認的底層容器是vector。在創建容器適配器的對象時,也可以指定其他合理的容器作為容器適配器的底層容器。創建容器適配器對象的方式如下
注意事項
容器適配器和底層容器是組合的關系,插入容器適配器中的元素最終都保存在底層容器中,容器適配器中的數據成員包括一個用于存儲元素的底層容器對象和一些輔助數據。
為什么選擇deque作為stack和queue的底層默認容器
stack是一種后進先出的特殊線性數據結構,因此只要具有push_back()和pop_back()操作的線性結構,都可 以作為stack的底層容器,比如vector和list都可以;queue是先進先出的特殊線性數據結構,只要具有 push_back和pop_front操作的線性結構,都可以作為queue的底層容器,比如list。但是STL中對stack和 queue默認選擇deque作為其底層容器,主要是因為:
總結
- 上一篇: 详解优先级队列priority_queu
- 下一篇: 成都大熊猫繁育基地观光路线