1.deque简介
queue和stack类似,是STL中的容器适配器,它们并不是容器,而是基于其他容器实现。那么什么叫容器适配器呢,大家可以想一想电源适配器,没错就是下面这个:
它能直接给手机充电吗?当然不能,那是它可以将电源转化为手机能够适应的电压。容器这里就相当于电源,容器适配器对容器的接口进行封装,以达到我们需要的要求。
queue的原理和操作十分简单,即先进先出原则,即只能从队列开头删除元素,只能从队列末尾删除元素,默认是基于deque(双端队列)实现的。使用时需要包含头文件<queue>。
既然它默认是基于deque实现,那么很容易想到,queue能实现的操作deque都能实现,事实也是如此。你可以会有疑问,既然如此,那为什么我们要用queue,而不是直接使用deque?在很多情况下,我们使用queue,就是为了告诉自己或别人,这是一个队列,防止熊孩子们的误操作,把多余的接口删除,防止不必要的错误。就如同const关键字,其存在意义就是为了防止数据被更改。
deque不提供迭代器,不提供随机访问。
2.构造
较为简单,直接看官方文档的例子:
// constructing queues
#include <iostream> // std::cout
#include <deque> // std::deque
#include <list> // std::list
#include <queue> // std::queue
int main ()
{
std::deque<int> mydeck (3,100); // deque with 3 elements
std::list<int> mylist (2,200); // list with 2 elements
std::queue<int> first; // empty queue
std::queue<int> second (mydeck); // queue initialized to copy of deque
std::queue<int,std::list<int> > third; // empty queue with list as underlying container
std::queue<int,std::list<int> > fourth (mylist);
std::cout << "size of first: " << first.size() << '\n';
std::cout << "size of second: " << second.size() << '\n';
std::cout << "size of third: " << third.size() << '\n';
std::cout << "size of fourth: " << fourth.size() << '\n';
return 0;
}
运行结果:
size of first: 0 size of second: 3 size of third: 0 size of fourth: 2 |
3.成员函数
empty | 判读队列是否为空,若为空返回ture,否则返回false |
size | 返回队列大小,返回值类型为无符号整型 |
front | 返回队列第一个元素 |
back | 返回队列最后一个元素 |
push | 向队列末尾插入元素 |
emplace | 向队列末尾插入元素,c++11新特性,效率比push高 |
pop | 删除第一个元素 |
swap | 交换队列 |
4.非成员函数
1.swap(queue1,queue2)交换两个队列,成员函数里也有swap这个函数,使用方法为queue1.swap(queue2)
2.重载了==,!=,<,>,<=,>= 比较关系符