C++ STL Queue容器使用详解
一、容器适配器概念
queue
是标准模板库(STL)中的容器适配器,它基于其他底层容器实现队列数据结构,遵循先进先出(FIFO)原则。其模板声明为:
template <class T, class Container = deque<T>>
class queue;
其中:
T
:存储元素的类型Container
:底层容器类型(默认使用deque)
二、底层容器选择
支持的容器要求
底层容器必须提供以下操作:
push_back()
pop_front()
front()
back()
empty()
size()
// 正确用法
queue<int, list<int>> queueList; // ✅ list支持所有必需操作// 错误用法
queue<int, vector<int>> queueVec; // ❌ vector没有pop_front()
容器 | 可用性 | 原因 |
---|---|---|
deque | ✅ | 默认适配容器 |
list | ✅ | 支持所有必需操作 |
vector | ❌ | 缺少高效pop_front() |
三、队列核心操作
1. 元素存取
queue<int> q;// 添加元素
q.push(1); // 拷贝元素到队尾
q.emplace(2); // 直接构造元素(推荐用于自定义对象)// 访问元素
q.front() = 10; // 修改队首元素(返回引用)
q.back() = 20; // 修改队尾元素(返回引用)// 移除元素
q.pop(); // 移除队首元素(无返回值)
2. 容量查询
cout << "元素数量: " << q.size(); // 获取队列长度
cout << "是否为空: " << q.empty(); // 判断空队列
四、完整代码解析
#include <iostream>
#include <queue>
#include <list>using namespace std;int main() {queue<int, list<int>> queueInt; // 使用list作为底层容器// 插入元素for(int i=1; i<=5; ++i){queueInt.push(i);}/* 修改元素值 */queueInt.front() = 66; // 修改队首queueInt.back() = 99; // 修改队尾// 获取元素值int frontVal = queueInt.front();int backVal = queueInt.back();// 输出结果cout << "队首元素: " << frontVal << endl; // 输出66cout << "队尾元素: " << backVal << endl; // 输出99// 容量操作if(!queueInt.empty()){cout << "队列长度: " << queueInt.size(); // 输出5}system("pause");return 0;
}
五、关键特性说明
-
元素访问
front()
/back()
返回引用,可直接修改元素值- 访问空队列的队首/队尾会导致未定义行为
-
插入操作对比
方法 特点 适用场景 push() 拷贝已有对象 基础类型 emplace() 直接构造新对象(效率更高) 自定义类对象 -
性能特征
- 所有操作时间复杂度:O(1)
- 元素存储在连续内存(vector)或离散内存(list)
六、使用注意事项
-
容器选择原则
- 需要频繁两端操作 → deque(默认最佳选择)
- 需要大量中间操作 → list
-
线程安全性
- STL容器非线程安全
- 多线程环境需要自行加锁
-
异常处理
- push()可能抛出内存分配异常
- pop()操作前必须检查empty()