當前位置:網站首頁>《STL適配器》stack和queue
《STL適配器》stack和queue
2022-07-23 06:54:42【李逢溪】
一、本篇目的
1、介紹STL六大組件之一--適配器
2、用list和vector實現stack和queue
二、什麼是適配器?
適配器是一種設計模式(設計模式是一套被反複使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結),該種模式是將一個類的接口轉換成客戶希望的另外一個接口。簡單來說,適配器其實就是我們寫代碼時的一個好的設計方式。比如我們要寫一個棧,我們可以直接用vector或者list做底層來實現。
三、實現stack
template<class T, class Con = deque<T>> class stack { public: void push(const T& x) { _c.push_back(x); } void pop() { assert(!empty()); _c.pop_back(); } bool empty() { return _c.empty(); } size_t size() { return _c.size(); } const T& top() { return _c.back(); } private: Con _c; };
四、實現隊列
template<class T, class Con = deque<T>> class queue { public: void push(const T& x) { _c.push_back(x); } void pop() { _c.pop_front(); } size_t size() { return _c.size(); } bool empty() { return _c.empty(); } const T& front() { return _c.front(); } const T& back() { return _c.back(); } private: Con _c; };
五、可以用vector做隊列的底層嗎?
void test1() { queue<int, vector<int>> s; s.push(1); s.push(2); s.push(3); s.push(4); while (!s.empty()) { cout << s.front() << endl; s.pop(); } }答:vector不能做queue的底層,因為queue需要pop_front(),而vector並沒有該接口,只有erase接口。
六、為什麼STL裏的stack和queue都是默認使用deque這樣的容器?
這裏需要介紹以下deque,deque是double queue的縮寫,它通常被稱作雙端隊列,因為它在兩端的插入删除效率很高,而隊列和棧正需要的就是兩端插入删除效率高的容器,因此deque常做stack和queue的底層容器。關於deque的底層是如何設計與實現的,我會專門出一篇來闡述deque的設計與實現。
版權聲明
本文為[李逢溪]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/204/202207221913296938.html
邊欄推薦
猜你喜歡
隨機推薦
- TypeScript
- 開源工具 SAP UI5 Tools 介紹
- Lark教程指南
- 網絡安全——使用Evil Maid物理訪問安全漏洞進行滲透
- 網絡安全—使用Ubuntu本地提權漏洞進行滲透及加固
- JWT工具類編寫
- Day1 Running Sum of 1d Array/Find Pivot Index/用兩個棧實現隊列
- socket編程之常用api介紹與socket、select、poll、epoll高並發服務器模型代碼實現
- 深入研究容器隊列
- Bean的初始化回調方法和釋放資源的回調方法
- 爬蟲數據保存到mysql數據庫
- 通過SQL進行數據分發
- Redis 分布式鎖如何自動續期(經典解决方案)
- 虹科動態 | cippe2022即將舉辦,報名火熱進行中
- Kotlin之匿名內部類(object: xxxx)
- 面試突擊:truncate、delete和drop的6大區別
- Ubuntu安裝Docker及Docker的基本命令 安裝MySQL
- LeetCode--棧和隊列篇
- etcd 集群部署
- TCP/IP協議族中需要必知必會的十大問題
- 【STM32學習】(21)STM32實現步進電機
- 繪制帶有查詢條件變量的table【grafana】
- 認識接口
- LABVIEW:創建一個VI
- 界面開發框架DevExtreme Gantt控件——可導出PDF、排序任務
- MySQL命令行導出導入數據庫和數據錶
- 有數大數據基礎平臺之智能運維平臺EasyEagle介紹:集群隊列篇
- 你記住JS中offsetWidth、clientWidth、width、scrollWidth、clientX、screenX、offsetX、pageX嗎?
- 【Azure 事件中心】Azure Event Hub 新功能嘗試 -- 异地灾難恢複 (Geo-Disaster Recovery)
- unity 照片牆
- 影響持續交付的因素有哪些?
- 【快速上手教程7】瘋殼·開源編隊無人機-地面站上比特機的使用和介紹
- Redis配置詳解
- docker安裝MySQL、redis
- 【嵌入式】限幅電路和鉗比特電路 利用二極管的單向導電性
- [知識圖譜]cql與py2neo學習筆記
- C語言學習
- 列轉行與數據集連接在業務場景的組合應用
- MySQL5.6/ 5.7 SSL配置
- 【深度學習】損失函數(平均絕對誤差,均方誤差,平滑損失,交叉熵,帶權值的交叉熵,骰子損失,FocalLoss)