前言
在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();
}
结果是: