當(dāng)前位置:
首頁 >
c++中容器适配器
發(fā)布時間:2023/11/30
44
豆豆
什么是容器適配器
適配器是一種設(shè)計模式(設(shè)計模式是一套被反復(fù)使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)),該中模式是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。
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;};- 每種容器都提供了一組接口,如果容器中的接口不能滿足需求,那么重新編寫容器還是改變我們的需求
- 應(yīng)該構(gòu)造一個容器接口到需求接口之間的轉(zhuǎn)換器,稱為容器適配器。
- 容器適配器將原容器進行了一層封裝,底層基于普通容器,上層對外提供封裝后的新接口,滿足不同使用者的需求。常用的棧stack、隊列deque、優(yōu)先級隊列priority_queue在STL中都有自己的容器適配器。
- 容器適配器對使用者是個黑盒,使用者無需知道容器適配器封裝的容器類型,而只需了解容器適配器提供的接口。除了使用STL提供的容器適配器,也可以自己構(gòu)造容器適配器,將STL中的容器進行封裝,對外提供所需的接口。
- 容器適配器可以封裝的容器類型根據(jù)容器適配器對外提供的接口和容器適配器的內(nèi)部算法而定。但是任何容器適配器對底層容器都有一些通用的要求,例如,底層容器必須支持添加刪除 和訪問尾元素操作,因此array不能作為容器適配器的底層容器。
- 棧適配器和隊列適配器默認的底層容器是deque,優(yōu)先隊列適配器默認的底層容器是vector。在創(chuàng)建容器適配器的對象時,也可以指定其他合理的容器作為容器適配器的底層容器。創(chuàng)建容器適配器對象的方式如下
注意事項
容器適配器和底層容器是組合的關(guān)系,插入容器適配器中的元素最終都保存在底層容器中,容器適配器中的數(shù)據(jù)成員包括一個用于存儲元素的底層容器對象和一些輔助數(shù)據(jù)。
為什么選擇deque作為stack和queue的底層默認容器
stack是一種后進先出的特殊線性數(shù)據(jù)結(jié)構(gòu),因此只要具有push_back()和pop_back()操作的線性結(jié)構(gòu),都可 以作為stack的底層容器,比如vector和list都可以;queue是先進先出的特殊線性數(shù)據(jù)結(jié)構(gòu),只要具有 push_back和pop_front操作的線性結(jié)構(gòu),都可以作為queue的底層容器,比如list。但是STL中對stack和 queue默認選擇deque作為其底層容器,主要是因為:
總結(jié)
- 上一篇: 详解优先级队列priority_queu
- 下一篇: c++动态内存管理