1. 程式人生 > >C++ STL 容器介面卡 棧介面卡

C++ STL 容器介面卡 棧介面卡

http://blog.sina.com.cn/s/blog_9946f55601016qwk.html

C++ STL 容器介面卡

    標準庫提供了三種順序容器介面卡:queuepriority_queuestack.介面卡是標準庫中通用的概念,包括容器介面卡、迭代器介面卡和函式介面卡。

    本質上,介面卡是使一事物的行為類似於另一類事物的行為的一種機制。容器介面卡讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現。例如,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

覆蓋基礎容器型別


預設的stackqueue都基於deque容器實現,而priority_queue則在vector容器上實現。在建立適
配器時,通過將一個順序容器指定為介面卡的第二個型別實參,可覆蓋其關聯的基礎容器型別:
stack< string, vector<string> > str_stk;
stack< string, vector<string> > str_stk(svec);


對於給定的介面卡,其關聯的容器必須滿足一定的約束條件。stack介面卡所關聯的基礎容器可以是任何一種順序容器型別。因此,stack

棧可以建立在vectorlistdeque容器之上。而queue介面卡要求其關聯的基礎容器必須提供push_front運算,因此只能建立在listdeque容器上,而不能建立vector容器上。priority_queue介面卡要求提供隨機訪問功能,因此可建立vectordeque容器上,但不能建立在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的操作。

http://blog.csdn.net/zfzf294990051/article/details/7515643

介面卡是使一種事物的行為符合另一事物行為的機制。為客戶端提供它想要的介面。

預設的stack 和 queue都是基於deque容器實現的,而priority_queue則是在vector容器上實現的。在建立介面卡時,通過將一個順序容器制定為介面卡的第二個型別實參,可覆蓋其基礎容器型別。

stack介面卡所關聯的容器可以是vector list deque中任意一種。

queue介面卡則要求關聯操作必須提供push_front操作,因此不能是vector

priority_queue介面卡要求能夠提供隨機訪問功能,可建立在vector deque上

1、棧介面卡實現

  1. int main(int argc,char **argv)  
  2. {  
  3.     const stack<int>::size_type stackSize = 20; //給定棧的大小
  4.     stack<int> intStack;//定義一個空棧
  5.     stack<int>::size_type i = 0;  
  6.     while(i != stackSize){ //往棧中新增值
  7.         intStack.push(i++);  
  8.     }  
  9.     while(!intStack.empty()){//如果棧不為空
  10.         cout<<intStack.top()<<endl; //輸出棧頂的元素
  11.         intStack.pop(); //彈出棧頂元素
  12.     }  
  13.     return 0;  
  14. }