C++容器介面卡
技術標籤:C++
一 簡介
容器介面卡 是一個比較抽象的概念,C++的解釋是:介面卡是使一事物的行為類似於另一事物的行為的一種機制。容器介面卡是讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式來實現的一種機制。其實僅是發生了介面轉換。那麼你可以把它理解為容器的容器,它實質還是一個容器,只是他不依賴於具體的標準容器型別,可以理解是容器的模版。或者把它理解為容器的介面,而介面卡具體採用哪種容器型別去實現,在定義介面卡的時候可以由你決定。
二 分類
1.stack 棧
棧的特徵是先進後出,後入棧的元素先出棧,先入棧的元素後出棧,因此站介面卡應該支援從棧頂新增刪除元素以及訪問元素的操作。容器vector、list和quque都滿足棧操作的條件,因此都能作為棧介面卡的底層容器,STL中預設使用deque作為棧介面卡的底層容器。
/* stack<int> s; stack< int, vector<int> > stk; //覆蓋基礎容器型別,使用vector實現stk s.empty(); //判斷stack是否為空,為空返回true,否則返回false s.size(); //返回stack中元素的個數 s.pop(); //刪除棧頂元素,但不返回其值 s.top(); //返回棧頂元素的值,但不刪除此元素 s.push(item); //在棧頂壓入新元素item */ int main() { stack<int> stack; cout << "棧為空輸出0,否則輸出1:" << (stack.empty() ? 0 : 1) << endl; stack.push(1); stack.push(2); stack.push(3); cout << "棧的大小:" << stack.size() << endl; cout << "棧頂是:" << stack.top() << endl; stack.pop(); cout << "刪除一個元素,棧頂是:" << stack.top() << endl; return 0; }
結果
2 queue 佇列
佇列的特徵是先進先出,先入隊的元素先出隊,後入隊的元素後出隊,因此佇列介面卡應該支援從隊頭刪除元素、向隊尾新增元素以及訪問隊頭隊尾元素的操作。由於容器vector在刪除首元素時需要移動所有元素,因此不適合作為佇列介面卡的底層容器,應該選用list或者deque,STL中預設使用deque作為佇列介面卡的底層容器。
例子
/* queue<int> q; q.empty(); //判斷佇列是否為空 q.size(); //返回佇列長度 q.pop();//刪除佇列首部的元素 q.push(item); //對於queue,在隊尾壓入一個新元素 q.front(); //返回隊首元素的值,但不刪除該元素 q.back(); //返回隊尾元素的值,但不刪除該元素 */ #include <queue> int main() { queue<int> queue; cout << "佇列為空輸出0,否則輸出1" << (queue.empty() ? 1 : 0) << endl; queue.push(1); queue.push(2); queue.push(3); cout << "佇列的大小是:" << queue.size() << endl; cout << "隊首是:" << queue.front() << endl; cout << "隊尾是:" << queue.back() << endl; queue.pop(); cout << "刪除一個元素後,佇列的大小是:" << queue.size() << endl; cout << "刪除一個元素後,隊首是:" << queue.front() << endl; cout << "刪除一個元素後,隊尾是:" << queue.back() << endl; return 0; }
結果
3 priority_queue 優先佇列
優先佇列在邏輯上與佇列相似,一端插入元素和另一端刪除元素,但是優先佇列在元素中加入了權重的概念。優先佇列中的元素並非像佇列一樣按照插入的順序依次排列,而是根據元素的權重排列。新增元素時按照元素優先順序插入到相應的位置,刪除元素時將優先順序最高的元素刪除。
優先佇列的插入刪除元素在底層容器實現的堆上進行操作。在堆的插入刪除演算法中,需要隨機訪問元素,因此不能使用list作為優先佇列介面卡的底層容器,比較而言deque也不太適合,STL中預設使用vector作為優先佇列介面卡的底層容器。
例子
#include<queue>
/*
priority_queue<int> q;
q.empty(); //判斷佇列是否為空
q.size(); //返回佇列長度
q.pop();//刪除隊首元素
q.push(item); //對於priority_queue,在基於優先順序的適當位置插入新元素
q.top(); //返回具有最高優先順序的元素值,但不刪除該元素
*/
int main()
{
priority_queue<int> pri;
cout << "優先佇列為空輸出0,否則輸出1:" << (pri.empty() ? 0 : 1) << endl;
pri.push(3);
pri.push(5);
pri.push(1);
while (!pri.empty())
{
cout << "優先佇列隊首是:" << pri.top() << endl;
pri.pop();
}
return 0;
}
結果
三 指定容器方法
stack<int, list<int>>stack;//指定list實現棧
queue<int, list<int>>queue;//指定list實現佇列
priority_queue<int, list<int>> prilist;//指定list實現優先佇列