C++容器介面卡
一、標準庫順序容器介面卡的種類
標準庫提供了三種順序容器介面卡:queue(FIFO佇列)、priority_queue(優先順序佇列)、stack(棧)
二、什麼是容器介面卡
首先,我們要明白介面卡是幹什麼的?其實就是一個介面轉換裝置,是得我們能用特定的方法去操作一些我們本來無法操作的東西。舉一個例子,比如你的一個裝置支援串列埠線,而你的電腦支援的是usb口,這時候,我們沒有必要重新買一個支援usb的裝置,只需要一根串列埠轉usb口的小玩意,讓你的裝置能夠連線到usb插口上,而它就是介面卡。
那麼C++中的容器介面卡是幹什麼的呢?可以做一個類比,我們已有的容器(比如vector、list、deque)就是裝置,這個裝置支援的操作很多,比如插入,刪除,迭代器訪問等等。而我們希望這個容器表現出來的是棧的樣子:先進後出,入棧出棧等等,此時,我們沒有必要重新動手寫一個新的資料結構,而是把原來的容器重新封裝一下,改變它的介面,就能把它當做棧使用了。
言歸正傳,理解了什麼是介面卡以後,其實問題就很簡單的。C++中定義了3種容器介面卡,它們讓容器提供的介面變成了我們常用的的3種資料結構:棧(先進後出)佇列(先進先出)和優先順序佇列(按照優先順序(“<”號)排序,而不是按照到來的順序排序)。
至於具體是怎麼變的,我們可以先了解一個大概:預設情況下,棧和佇列都是基於deque實現的,而優先順序佇列則是基於vector實現的。當然,我們也可以指定自己的實現方式。但是由於資料結構的關係,我們也不能胡亂指定。棧的特點是後進先出,所以它關聯的基本容器可以是任意一種順序容器,因為這些容器型別結構都可以提供棧的操作有求,它們都提供了push_back、pop_back和back操作。 佇列queue的特點是先進先出,介面卡要求其關聯的基礎容器必須提供pop_front操作,因此其不能建立在vector容器上;對於優先順序佇列,由於它要求支援隨機訪問的功能,所以可以建立在vector或者deque上,不能建立在list上。
三、容器介面卡
要使用介面卡,需要加入一下標頭檔案:
#include <stack> //stack
#include<queue> //queue、priority_queue
種類 | 預設順序容器 | 可用順序容器 | 說明 |
---|---|---|---|
stack | deque | vector、list、deque | |
queue | deque | list、deque | 基礎容器必須提供push_front()運算 |
priority_queue | vector | vector、deque | 基礎容器必須提供隨機訪問功能 |
四、定義介面卡
1、初始化
stack<int> stk(dep);
2、覆蓋預設容器型別
stack<int,vector<int> > stk;
五、容器介面卡的使用
1、下面的程式讀入一系列單詞儲存在stack中,然後再顯示輸入的單詞。
#include <iostream> #include <stack> #include <string> using namespace std; int main() { stack<string> words; string str; cout<<"Enter some words(Ctrl + Z to end):"<<endl; while(cin >> str) { words.push(str); } while(words.empty() == false) { cout<<words.top()<<endl; words.pop(); } return 0; }