網(wǎng)站首頁 編程語言 正文
容器適配器
適配器是一種設(shè)計模式(設(shè)計模式是一套反復(fù)使用的、大部分人知道的代碼設(shè)計經(jīng)驗(yàn)的總結(jié)),該模式試講一個類的接口轉(zhuǎn)化為用戶希望的另一個接口,雖然stack與queue中也可以存放元素,但在STL中并沒有將其劃分為容器,而是成為容器適配器,這是因?yàn)閟tack與隊列只是堆其他容器進(jìn)行了包裝,STL中的stack和queue是使用雙端隊列進(jìn)行封裝的。
雙端隊列
概念
它是一種雙開口的連續(xù)空間數(shù)據(jù)結(jié)構(gòu)(與隊列沒有關(guān)系),雙開口的含義是可以再兩端進(jìn)行插入刪除操作,且時間復(fù)雜度為O(1),與vector比較,頭插效率比較高,不需要移動數(shù)據(jù),與list比較,空間利用率高。
結(jié)構(gòu)
deque并不是真正的連續(xù)空間,而是使用一小段連續(xù)的小空間拼接而成,實(shí)際上deque類似于一個動態(tài)的二維數(shù)組,其底層結(jié)構(gòu)如下圖所示:
中控數(shù)組map:?map數(shù)組是一個指針數(shù)組,指向多個buff數(shù)組用來儲存數(shù)據(jù),當(dāng)buff數(shù)組頭或尾滿了,就新開辟一個buff數(shù)組,其指針存在map的相對應(yīng)位置,當(dāng)map數(shù)組滿了,會對map數(shù)組擴(kuò)容(指針數(shù)組的擴(kuò)容并不會效率低)
deque迭代器
deque所謂的連續(xù)空間是一個假象,是他底層復(fù)雜的迭代器實(shí)現(xiàn)
STL源碼:
typedef T** map_pointer;
T* cur;
T* first;
T* last;
map_pointer node
- cur:是當(dāng)前的node指向的buff數(shù)組當(dāng)前指向的地址
- first:是當(dāng)前node指向的buff數(shù)組,第一個元素的地址。
- last:是當(dāng)前node指向的buff數(shù)組,最后一個元素的地址。
- node:是指向當(dāng)前map數(shù)組對應(yīng)的指針,由于他指向的也是一個指針·,所以為二級指針。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
雙端隊列,說明他很合適頭插頭刪,尾插尾刪,他去做stack和queue的容器適配器很合適。
缺點(diǎn):
雙端隊列中間插入刪除非常麻煩,效率不高。
deque是一種折中的方案設(shè)計,隨機(jī)訪問效率不如vector,任意插入刪除不及l(fā)ist
stack模擬
stack是一種容器適配器,專門在具有后進(jìn)先出的上下文環(huán)境中,其刪除只能是在一端進(jìn)行操作。
stack是作為容器適配器被實(shí)現(xiàn)的,容器適配器即是對特定類封裝作為其底層的容器,并提供一組特定的成員函數(shù)來訪問其元素,將特定類作為其底層的,元素特定容器的尾部(即棧頂)被壓入和彈出 。
stack的底層原理可以是任何標(biāo)椎的容器類模板或者一些特定的容器類,這些容器類應(yīng)該支持以下操作:
- empty:判空操作。
- back:尾部元素獲取。
- push_back:尾部插入元素操作
- pop_back:尾部刪除元素操作。
模擬實(shí)現(xiàn)
template<class T, class Con = deque<T>>
class stack
{
public:
stack();
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_back();
}
T& top()
{
return _c.back()
}
const T& top()const
{
return _c.back();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
?
queue模擬實(shí)現(xiàn)
隊列是一種容器適配器,專門用于在FIFO上下文(先進(jìn)先出)中操作,其中從容器一端插入元素,另一端提取元素
隊列作為容器適配器實(shí)現(xiàn),容器適配器即將特定容器類封裝作為其底層容器類,queue提供一組特定的成員函數(shù)來訪問其元素。元素從隊尾入隊列,從隊頭出隊列
底層容器可以是標(biāo)準(zhǔn)容器類模板之一,也可以是其他專門設(shè)計的容器類。該底層容器應(yīng)至少支持以下操作:
- empty:檢測隊列是否為空
- size:返回隊列中有效元素的個數(shù)
- front:返回隊頭元素的引用
- back:返回隊尾元素的引用
- push_back:在隊列尾部入隊列
- pop_front:在隊列頭部出隊列
模擬實(shí)現(xiàn)
template<class T, class Con = deque<T>>
class queue
{
public:
queue();
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_front();
}
T& back()
{
return _c.back();
}
const T& back()const
{
return _c.back();
}
T& front()
{
return _c.front();
}
const T& front()const
{
return _c.front();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
?
原文鏈接:https://blog.csdn.net/m0_52012656/article/details/123823948
相關(guān)推薦
- 2022-10-13 windows中python實(shí)現(xiàn)自動化部署_python
- 2022-05-21 Kubernetes特別屬性的標(biāo)簽Label的強(qiáng)大作用_服務(wù)器其它
- 2022-12-02 C語言鏈表案例學(xué)習(xí)之通訊錄的實(shí)現(xiàn)_C 語言
- 2022-07-03 Android利用貝塞爾曲線繪制動畫的示例代碼_Android
- 2022-04-30 C語言鏈表實(shí)現(xiàn)商品庫存管理系統(tǒng)_C 語言
- 2022-12-24 Docker網(wǎng)絡(luò)模型以及容器通信詳解續(xù)篇_docker
- 2023-01-12 關(guān)于scipy.optimize函數(shù)使用及說明_python
- 2022-08-19 Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支