什麼是容器介面卡?
容器介面卡:介面卡底層沒有自己的資料結構,它是另外乙個容器的封裝,它的方法全部由底層依賴的容器進行實現的;它沒有實現自己的迭代器,不能使用迭代器遍歷。
來看這個例子:我們使用容器介面卡來實現乙個棧。
template>
class stack
void
pop(
) t top()
const
private:
container con;
};
實現成功,相當於棧將deque**了一下,也成為**模式。push將底層容器的push_back**了,pop將底層pop_back**了,棧的top將容器底層的back**了。
我們使用庫中的棧,需要加上標頭檔案
stack常用方法:
1.push();//入棧
2.pop();//出棧
3.top();//檢視棧頂元素
4.empty();//判斷棧空
5.size();//返回元素個數
簡單使用一下:
stack<
int> s1;
for(
int i=
0; i<20;
++i)
cout <<
"棧中元素個數:"
<
size()
<< endl;
while
(!s1.
empty()
)
我們使用庫中的佇列,需要加上標頭檔案
stack常用方法:1.push();//入隊
2.pop();//出隊
3.front();//檢視隊頭元素
4.back();//產看隊尾元素
5.empty();//判空
6.size();//返回佇列元素個數
簡單使用一下:
queue<
int> que;
for(
int i=
0; i<20;
++i)
cout <<
"佇列中元素個數:"
<
size()
<< endl;
while
(!que.
empty()
)
優先順序佇列:底層資料結構為大根堆。我們使用庫中的優先順序佇列,需要加上標頭檔案
;優先順序佇列,誰優先順序大誰先出隊,誰優先順序小,誰後出隊。stack常用方法:1.push();//入優先順序佇列
2.pop();//出優先順序佇列
3.top();//檢視隊頂元素
4.empty();//判斷隊空
5.size();//返回元素個數
簡單使用一下:
priority_queue<
int> pque;
for(
int i=
0; i<20;
++i)
cout <<
"優先順序佇列中元素個數:"
<
size()
<< endl;
while
(!pque.
empty()
)
執行成功:資料從大到小依次出隊,資料越大優先順序越高。
問題一:stack與queue第二個模板型別引數依賴deque,為什麼不依賴vector?而優先順序佇列為什麼底層依賴vector?
1.vector的初始記憶體使用效率太低,沒有deque好。
2.對於queue來說,需要支援尾部插入,頭部刪除,時間複雜度需要為o(1),deque恰好符合條件,若用vector其底層效率太低。
3.vector需要大片的連續記憶體,而deque只需要分段的記憶體,當儲存大量資料時,顯然deuqe對於記憶體的利用率更高更好一些。
問題二:優先順序佇列為什麼底層依賴vector?
優先順序佇列底層預設把資料組成乙個大根堆結構,將大根堆結構看作一棵樹,如果將大根堆結構所有元素放入陣列中,使用下標計算其結點。若根節點為i,左孩子為2i+1,右孩子為2i+2;大根堆為堆頂,其元素最大,結點與左右孩子關係使用下標計算,就需要每乙個元素記憶體必須是連續的,因此底層依賴vector;而deque的第二維不是連續的,不能使用。
容器介面卡(棧容器介面卡 佇列容器介面卡)
我們已有的容器 比如vector list 這個容器支援的操作很多,比如插入,刪除,迭代器訪問等等。而我們希望這個容器表現出來的是棧的樣子 先進後出,入棧出棧等等,此時,我們沒有必要重新動手寫乙個新的資料結構,而是把原來的容器重新封裝一下,改變它的介面,就能把它當做棧使用了。c 定義了三種容器介面卡...
介面卡模式 實現優先順序佇列
介面卡模式 由於建立大堆和建立小堆方式相同,相似,所以可以通過新增乙個比較器 利用compare,定義偽函式less和greater 實現大小資料的比較,防止大量 重複。templatestruct less 小堆呼叫 templatestruct greater 大堆呼叫 templateclas...
C STL 容器介面卡
標準庫提供了三種順序容器介面卡 queue priority queue stack.介面卡是標準庫中通用的 概念,包括容器介面卡 迭代器介面卡和函式介面卡。本質上,介面卡是使一事物的行為類似於另一類事物的行為的一種機制。容器介面卡讓一種已 存在的容器型別採用另一種不同的抽象型別的工作方式實現。例如...