STL queue
和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据。
最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有“先进先出(简称 “FIFO” )”的特点,因此 queue 又称为队列适配器。queue 容器适配器模拟的就是队列这种存储结构。
创建queue容器
//方法一
std::queue<int> values;
//方法二
使用deque 和 list容器作为基础容器的空 queue 容器适配器
std::queue<int, std::list<int>> values;
//方法三
用基础容器来初始化 queue 容器适配器
std::deque<int> values{1,2,3};
std::queue<int> my_queue(values);
//方法四
std::deque<int> values{1,2,3};
std::queue<int> my_queue1(values);
std::queue<int> my_queue(my_queue1);
//或者使用std::queue<int> my_queue = my_queue1;
queue容器适配器支持的成员函数
成员函数 | 功能 |
---|---|
empty() | 如果 queue 中没有元素的话,返回 true。 |
size() | 返回 queue 中元素的个数。 |
front() | 返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
back() | 返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 |
push(const T& obj) | 在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。 |
emplace() | 在 queue 的尾部直接添加一个元素。 |
push(T&& obj) | 以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。 |
pop() | 删除 queue 中的第一个元素。 |
swap(queue &other_queue) | 将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
示范代码:
#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main(){
//构建queue容器
deque<int> de{1,2,3};
queue<int> myQueue(de);
//查看元素个数
cout<<"元素个数:"<<myQueue.size()<<endl;
//访问队列中所有元素
while(!myQueue.empty()){
cout<<myQueue.front()<<endl;
myQueue.pop();
}
return 0;
}
运行结果:
priority_queue 容器适配器模拟的也是队列这种存储结构,即使用此容器适配器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素。
但是,priority_queue 容器适配器中元素,先进队列的元素并不一定先出队列,而是优先级最大的元素最先出队列。
每个 priority_queue 容器适配器在创建时,都制定了一种排序规则。根据此规则,该容器适配器中存储的元素就有了优先级高低之分。基于 priority_queue 的这种特性,因此该容器适配器有被称为优先级队列。用法详见http://c.biancheng.net/view/6987.html