queue容器
queue(队列)是 C++ STL 中的容器适配器,底层默认基于deque实现 (也可以指定为list),遵循先进先出 (FIFO) 原则 ------ 只能从队尾插入元素,从队首删除 / 访问元素,无法随机访问中间元素,非常适合模拟排队、任务调度等场景。 特点:
- 封闭性:仅暴露队首(front)和队尾(back)操作,不支持迭代器遍历;
- 适配器特性:可指定底层容器(如
list),只要满足back()/push_back()/front()/pop_front()/empty()/size()接口即可; - 无迭代器:无法像
vector/list那样遍历,只能逐个取出队首元素。
基本使用
- 使用 queue 需包含 <queue>头文件;
c++
#include <queue>
- 初始化
c++
// 1.定义一个空队列,默认底层使用deque容器
queue<int> q1;
// 2.指定底层容器为list
queue<int, list<int>> q2;
// 3、拷贝构造,可以是队列、链表和双端队列
// 需要保证底层容器是一致的
list<int> lst = { 0, 1, 2, 3 };
queue<int, list<int>> q3(lst);
queue<int, list<int>> q4(q2);
! 注意\] 使用queue的拷贝构造函数时,需要保证底层容器是一致的
核心操作API
empty()判断队列是否为空,返回 bool(空为 true)size()返回队列中元素个数(unsigned int 类型)front()返回队首元素的引用(可修改,需非空)back()返回队尾元素的引用(可修改,需非空)push(val)队尾插入元素 valemplace(val)队尾直接构造元素(效率高于 push)pop()删除队首元素(无返回值,需非空)swap(q)交换两个同类型队列的内容
c++
queue<int> q1;
// 插入
q1.push(10);
q1.push(20);
q1.push(30);
q1.push(40);
// 访问队首和队尾元素
cout << q1.front() << endl; // 10
cout << q1.back() << endl; // 40
// 当前队列大小
cout << "size = " << q1.size() << endl;
// 删除队首元素
q1.pop();
cout << q1.front() << endl; // 20
// 判断队列是否为空
if (q1.empty())
{
cout << "空" << endl;
}
使用注意
- 空队列操作风险 :调用
front()、back()、pop()前必须用empty()判断队列非空,否则会触发未定义行为(程序崩溃)。 - 无遍历能力 :
queue没有迭代器,无法用for循环遍历,若需遍历需先复制队列并循环pop。
c++
queue<int> q1;
// 插入
q1.push(10);
q1.push(20);
q1.push(30);
q1.push(40);
// 遍历保留数据
// 1、先拷贝数据
queue<int> q2(q1);
// 2、遍历
while (!q2.empty())
{
cout << q2.front() << endl;
q2.pop();
}
- 清空队列 :STL 的
queue未提供clear()函数,需通过while(!q.empty()) q.pop()实现。 - 底层容器替换 :若需指定
list为底层容器,需保证底层容器支持front()、back()、push_back()、pop_front()、empty()、size()这些操作(deque/list均满足)。
结束语
queue是 FIFO 结构的容器适配器,仅支持队首 / 队尾操作,无随机访问和迭代器;- 核心操作:
push()/emplace()(入队)、pop()(出队)、front()/back()(访问)、empty()/size()(状态查询); - 空队列调用
front()/back()/pop()会导致未定义行为,使用前务必检查非空。