標準庫提供了三種順序容器適配器:queue、priority_queue、stack.適配器是標準庫中通用的
概念,包括容器適配器、迭代器適配器和函數適配器。
本質上,適配器是使一事物的行爲類似於另一類事物的行爲的一種機制。容器適配器讓一種已
存在的容器類型採用另一種不同的抽象類型的工作方式實現。例如,stack適配器可使任何一種順
序容器以棧的方式工作。如下列出了所有容器適配器通用的操作和類型。
size_type 一種類型,足以存儲此適配器類型最大對象的長度
value_type 元素類型
container_type 基礎容器類型,適配器在此容器類型上實現
A a; 創建一個新的空適配器,命名爲a
A a(c); 創建一個名爲a的新適配器,初始化爲容器c的副本
關係操作符 所有適配器都支持全部關係操作符:==、!=、<、<=、>、>=
使用適配器時,必須包含相關的頭文件:
#include<stack> #include<queue>
適配器的初始化
deque<int> deq;
stack<int> stk(deq); //將deq中的元素複製到stk中
覆蓋基礎容器類型
默認的stack和queue都基於deque容器實現,而priority_queue則在vector容器上實現。在創建適
配器時,通過將一個順序容器指定爲適配器的第二個類型實參,可覆蓋其關聯的基礎容器類型:
stack< string, vector<string> > str_stk;
stack< string, vector<string> > str_stk(svec);
對於給定的適配器,其關聯的容器必須滿足一定的約束條件。stack適配器所關聯的基礎容器可以是
任何一種順序容器類型。因此,stack棧可以建立在vector、list、deque容器之上。而queue適配器
要求其關聯的基礎容器必須提供push_front運算,因此只能建立在list和deque容器上,而不能建立
在vector容器上。priority_queue適配器要求提供隨機訪問功能,因此可建立vector或deque容器上,
但不能建立在list容器上。
適配器的關係運算
兩個相同類型的適配器可以做==、!=、<、<=、>、>= 關係比較,只要基礎元素類型支持等於和小
於操作符即可。這些關係運算由元素依次比較來實現。第一對不相等的元素將決定兩者之間的小於
或大於關係。
棧適配器
s.empty() 如果棧爲空,返回true,否則返回false
s.size() 返回棧中元素的個數
s.pop() 刪除棧頂元素,但不返回其值
s.top() 返回棧頂元素,但不刪除其值
s.push(item) 在棧頂壓入新元素
隊列和優先級隊列
q.empty() 如果對列爲空,返回true,否則返回false
q.size() 返回隊列中元素的個數
q.pop() 刪除隊列首元素,但不返回其值
q.front() 返回隊列首元素的值,但不刪除該元素 該操作適用於queue而非priority_queque
q.back() 返回隊尾元素的值,而不刪除該元素 該操作適用於queue而非priority_queque
q.top() 返回具有最高優先級的元素值,但不刪除該元素 該操作適用於priority_queque
q.push(item) 對於queue,在隊尾壓入一個新元素
對於priority_queue,在基於優先級的適當位置插入新元素
注意:所有容器適配器都根據其基礎容器類型所支持的操作來定義自己的操作。例如,默認情況下
棧適配器建立在deque容器上,因此採用deque提供的操作來實現棧功能。比如說,執行下面的語
句 intStack.push(ix++); 這個操作通過調用push_back操作來實現,而該push_back操作由intStack
所基於的deque對象提供。儘管棧是以deque容器爲基礎實現的,但是程序員不能直接訪問deque
所提供的操作。不能在棧上調用push_back函數,而是必須使用棧所提供的名爲push的操作