網站首頁 編程語言 正文
一. 什么是適配器與容器適配器?
適配器是一種設計模式(設計模式是一套被反復使用的,多數人知曉的,經過分類編目的,代碼設計經驗的總結),該種模式將一個類的接口轉換成用戶需要的另外一個接口。
舉個例子:在日常生活中,當手機沒電了,我們需要給手機充電,給手機充電的方式很多,可以插到電源上,也可以用充電寶,還可以直接連著電腦充。而我們并不關心用什么給它充電,我們關心的只是能否給手機充上電。適配器充當的角色就是 給手機充電的接口,它會將不同大小的電壓轉化成適合給手機充電的電壓。容器適配器的概念可以結合這個例子理解,它以 某種容器作為底層結構,改變其接口,使它符合該容器的特性。
容器適配器:以某種已有的既定容器作為底層結構,在其基礎上進一步地進行封裝接口函數。使其可以滿足某種特性。
下面將介紹三個用到容器適配器的結構:stack棧,queue隊列,priority_queue優先級隊列,通過這三個結構,我們可以更好的理解容器適配器的用途。
二. 理解容器適配器
STL的六大組件
我們可以看出雖然stack,queue,priority_queue中也可以存放數據,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器配接器,這是因為stack,queue,priority_queue只是對其它容器的接口進行了包裝,STL中stack和queue默認使用deque,priority_queue默認使用vector作為容器。我們現在來看看它們的底層接口和實現
stack的模擬實現
知道了容器適配器后,stack的模擬實現就簡單了,我們只需要調用指定容器deque的各個成員函數即可實現stack的各個函數接口。
底層實現代碼如下:stack底層利用deque雙端隊列進行包裝,需要更改成多參數模板,最便利的一點就是,stack的底層函數的實現可以直接調用容器的函數接口,不需要自己再一步步實現。
namespace nn //命名空間域:防止命名沖突 { //多參數模板 template<class T, class Container = std::deque<T>>//可以明顯看出stack配接器的底層容器是deque雙端隊列,后面會介紹 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//const修飾 { return _con.back(); } //獲取棧中有效元素個數 size_t size() const { return _con.size(); } //判斷棧是否為空 bool empty() const { return _con.empty(); } //交換兩個棧中的數據 void swap(stack<T, Container>& st)//注意stack<T,Container>才是類型,加引用,別名,減少拷貝 { _con.swap(st._con);//調用deque的算法swap } private: //deque<T> _con底層 Container _con;//將一個類的接口轉換成用戶需要的另一種接口,即利用deque容器轉換成stack配接器 }; }
queue的模擬實現
同樣的方式,我們也是通過調用所指定容器的各個成員函數來實現queue的。
底層實現代碼如下:
namespace nn //防止命名沖突 { 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;//deque<T> _con; }; }
思考stack 和 queue 是否存在迭代器?
stack 和 queue 都不具備迭代器, 因為兩者都不具備遍歷走訪功能,所以自然不需要設計迭代器
stack 和 queue可以以哪些容器作為底層容器?
實際上stack使用vector作為底層容器也是可以的,queue使用deque雙端隊列+list帶頭雙向循環鏈表作為底層容器也是可以的。
但是deque在設計上相比于list和vector,作為stack,queue的底層結構更優。
底層容器如何傳進去?
作為模板參數傳入template<class T,class Container = deque<T>>
,用了默認參數(缺省參數)
原文鏈接:https://blog.csdn.net/weixin_63449996/article/details/128624482
相關推薦
- 2022-06-30 C++?select模型簡單聊天室的實現示例_C 語言
- 2022-09-16 Python封裝zabbix-get接口的代碼分享_python
- 2022-02-13 如何將pytorch模型部署到安卓
- 2022-08-10 Github簡單易用的?Android?ViewModel?Retrofit框架_Android
- 2022-10-18 shell腳本批量將文件復制到指定的文件夾下_linux shell
- 2022-04-12 python?獲取list?長度_python
- 2022-03-24 C/C++實現蛇形矩陣的示例代碼_C 語言
- 2022-05-20 解決cnpm : 無法加載文件 C:\Users\Administrator\AppData\Roa
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支