容器介面卡

2021-09-08 22:04:49 字數 2902 閱讀 6210

除了順序容器外,標準庫還定義了三個順序容器介面卡:stack、queue和priority_queue。介面卡是標準庫中的乙個通用概念。容器、迭代器和函式都有介面卡。本質上,乙個介面卡是一種機制。能使某種事物的行為看起來像另外一種事物一樣。乙個容器介面卡接受一種已有的容器型別,使其行為看起來像一種不同的型別。例如,stack介面卡接受乙個順序容器(除array或forward_list外),並使其操作起來像乙個stack一樣。下表列出了所有介面卡都支援的操作和型別:

所以容器介面卡都支援的操作和型別

size_type      一種型別,足以儲存當前型別的最大物件的大小

value_type     元素型別

container_type     實現介面卡的底層容器型別

a a;          建立乙個名為a的空介面卡

a a(c);       建立乙個名為a的介面卡,帶有容器c的乙個拷貝

關係運算子      每個介面卡都支援所有關係運算子:==、!=、<、<=、>和》=,這些運算子返回底層容器的比較結果

a.empty()      若a包含任何元素,返回false,否則返回true

a.size()       返回a中的元素數目

swap(a,b)       交換a和b的內容,a和b必須有相同的型別,包括底層容器型別也必須相同

a.swap(a,b)

定義乙個介面卡

每個介面卡都定義了兩個建構函式:預設建構函式建立以空物件,接受乙個容器的建構函式拷貝該容器來初始化介面卡。例如,假定deq是乙個deque,我們可以用deq來初始化乙個新的stack,如下所示:

stackstk(deq);   //從deq拷貝元素到stk

預設情況下,stack和queue是基於deque實現的,priority_queue是在vector之上實現的。我們可以在建立乙個介面卡時將乙個命名的順序容器作為第二個型別引數,來過載預設容器型別:

//vector上實現的空棧

stack> str_stk;  //預設是在deque上實現的,這裡顯示的指定為在vector上實現

//str_stk2在vector上實現,初始化時儲存svec的拷貝

stack> str_stk2(svec);

對於乙個給定的介面卡,可以使用哪些容器是有限制的。所有介面卡都要求容器具有新增和刪除元素的能力。因此,介面卡不能構造在array之上。類似的,我們也不能用forward_list來構造介面卡,因為所有介面卡要求容器具有新增、刪除以及訪問尾元素的能力。stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list之外的任何容器型別來構造stackqueue介面卡要求back、push_back、front和push_front,因此它可以構造與list和deque之上,但不能基於vector構造priority_queue除了front、push_back和pop_back操作之外還要求隨機訪問能力,因此它可以構造於vector和deque之上,但不能基於list構造

棧介面卡

stack型別定義在stack標頭檔案中。下表列出了stack支援的操作。下面的程式展示了如何使用stack:

stack intstack;  //

空棧//

填滿棧for(size_t ix=0;ix!=10;++ix)

intstack.push(ix);

while(!intstack.empty())

棧操作棧預設是基於deque實現,也可以在list或vector上實現

s.pop()       刪除棧頂元素,但不返回該元素的值

s.push(item)    建立乙個新元素壓人棧頂,該元素通過拷貝或移動item而來,或者由args構造

s.emplace(args)  

s.top()      返回棧頂元素,但不將元素彈出棧

每個容器介面卡都基於底層型別的操作定義了自己的特殊操作。我們只能使用介面卡操作,而不能使用底層容器型別的操作。例如:

intstack.push(ix);    

此語句試圖在intstack的底層deque物件上呼叫push_back。雖然stack是基於deque實現的,但我們不能直接使用deque操作。不能在乙個stack上呼叫push_back,而必須使用stack自己的操作——push。

佇列介面卡

queue和priority_queue介面卡定義在queue標頭檔案中。下表列出了它所支援的操作:

queue和priority_queue的操作

queue預設基於deque實現,priority_queue預設基於vector實現;

queue也可以由list或vector實現,priority_queue也可以用deque實現

q.pop()         返回queue的首元素或priority_queue的最高優先順序的元素,但不刪除此元素

q.front()        返回首元素或尾元素,但不刪除此元素

q.back()        只適用於queue

q.top()       返回最高優先順序元素,但不刪除該元素,只適用於priority_queue

q.push(item)    在queue末尾或priority_queue中恰當的位置建立乙個元素。其值為item,或者由args構造

q.emplace(args)  

標準庫queue使用一種先進先出的儲存和訪問策略。進入佇列的物件被放置在隊尾,而離開佇列的物件則從隊首刪除。

priority_queue允許我們為佇列中的元素建立優先順序。新加入的元素會排在所有優先順序比它低的已有元素之前。

容器介面卡(棧容器介面卡 佇列容器介面卡)

我們已有的容器 比如vector list 這個容器支援的操作很多,比如插入,刪除,迭代器訪問等等。而我們希望這個容器表現出來的是棧的樣子 先進後出,入棧出棧等等,此時,我們沒有必要重新動手寫乙個新的資料結構,而是把原來的容器重新封裝一下,改變它的介面,就能把它當做棧使用了。c 定義了三種容器介面卡...

容器介面卡

容器介面卡通常是讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現,一般情況下,它的初始化需要傳遞乙個容器作為引數,而它所有的操作也是在這個容器上實現的。標準庫提供了三種順序容器介面卡 stack queue priority queue,使用它們時需要包含 include 和 inclu...

容器介面卡

容器介面卡 stl 中包含三種介面卡 棧stack 佇列queue 和優先順序priority queue 介面卡是容器的介面,它本身不能直接儲存元素,它儲存元素的機制是呼叫另一種順序容器去實現,即可以把介面卡看作 它儲存乙個容器,這個容器再儲存所有元素 stl 中提供的三種介面卡可以由某一種順序容...