前言
在STL中定義了三種容器適配器:queue,priority_queue,和stack。
容器適配器是利用基本容器(如之前介紹的deque,vector,list)作爲自己的底層容器,適配它以實現自己特定功能的容器。
容器適配器有一個共同的特點:都不支持迭代器(Iterator)。
1.queue
特點:FIFO(先進先出)原則。
模板定義
template <class T,class Container = deque<T>> class queue
T是指存儲的數據類型
Container是指用於保存queue的容器類型,默認的容器是deque,還可以使用list作爲queue的底層容器,但不能使用vector作爲其的底層容器,因爲vector不支持pop_front()函數。
queue的構造函數:
explicit queue(const Container &cnt = Container())
此構造函數創建空的queue。
queue的頭文件是:
#include <queue>
queue成員函數
value_type &back(); const value_type &back() const | 返回queue中最後一個元素 |
bool empty() const | 如果調用queue爲空則返回true,否則返回false |
value_type &front(); const value_type &front() const | 返回queue中第一個元素 |
void pop() | 刪除queue中第一個元素 |
void push(const T &val) | 將值爲val的元素加到queue的尾部 |
size_type size() const | 返回queue中當前元素個數 |
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
if (!q.empty())
{
cout<<"size() = "<<q.size()<<"\n";
}
cout<<"back() = "<<q.back()<<" ; front() = "<<q.front()<<"\n";
q.pop();
cout<<"after pop, size() = "<<q.size()<<"\n";
q.push(5);
cout<<"after push(), size() = "<<q.size()<<"\n";
cout<<"contents of queue: ";
for (int i=0;i<q.size();i++)
{
cout<<q.front()<<" ";
q.push(q.front());
q.pop();
}
結果爲:
2.priority_queue
特點:按優先級來排序queue中的元素
類模板
template<class T,class Container = vector<T>, class Comp = less<Container::value_type> > class priority_queue
T指存儲的數據類型
Container是保存priority queue的容器類型,默認是vector,底層容器必須支持隨機訪問迭代器,因此底層容器可以是deque,不能是list。
Comp指priority queue中元素的比較函數
priority_queue適配器有以下構造函數
explicit priority_queue(const Comp &cmpfn = Comp(),Container &cnt = Container());
template<class InIter>
priority_queue(InIter start,InIter end,const Comp &cmpfn = Comp(),Container &cnt = Container())
第一個構造函數創建空的priority_queue
第二個構造函數創建由start和end指定範圍的priority queue。
priority_queue頭文件:
#include <queue>
priority_queue成員函數
bool empty() | 如果調用priority_queue爲空,返回true,否則返回false |
void pop() | 刪除priority_queue中第一個元素 |
void push(const T &val) | 將元素添加到priority_queue隊列中 |
size_type size() const | 返回priority_queue中當前元素個數 |
const value_type &top() const | 返回priority_queue中優先級最高的元素,不刪除元素 |
Example
#include <iostream>
#include <queue>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
priority_queue<double> pq;
pq.push(1.0);
pq.push(8.9);
pq.push(3.5);
cout<<"size = "<<pq.size()<<"\n";
while(!pq.empty()){
cout<<pq.top()<<" \n";
pq.pop();
}
return 1;
}
結果是:
3.stack
特點:後進先出。
類模板:
template <class T,class Container = deque<T> > class stack
T是存儲的數據類型
Container指底層的容器類型,默認是deque,還可以使用vector,list作爲其的底層容器。
stack適配器的構造函數:
explicit stack(const Container &cnt = Container())
創建空的stack
頭文件是:
#include <stack>
stack成員函數
bool empty() const | 如果stack爲空返回true,否則返回false |
void pop() | 刪除stack棧頂元素,也是容器中最後添加的元素 |
void push(const T &val) | 將元素壓進堆棧,也就是棧頂元素 |
size_type size() const | 返回當前棧內元素個數 |
value_type &top(); const value_type &top() const | 返回棧頂元素的引用,不會刪除棧頂元素 |
Code Example
stack<char> s;
s.push('A');
s.push('B');
s.push('C');
s.push('D');
while (!s.empty())
{
cout<<"Popping: ";
cout<<s.top()<<"\n";
s.pop();
}
結果是: