【C++ STL】queue队列容器的基本使用

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)队尾插入元素 val
  • emplace(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() 会导致未定义行为,使用前务必检查非空。
相关推荐
桦说编程19 小时前
你的函数什么颜色?—— 深入理解异步编程的本质问题(上)
后端·性能优化·编程语言
codetown4 天前
C3 编程语言:现代系统级开发的演进与工程实践全指南
编程语言
IT老小子4 天前
【C++STL】Vector的使用(1)
编程语言
会员源码网6 天前
尝试修改常量值(`Fatal error: Cannot re-assign auto-global variable _POST`)
编程语言·代码规范
怕浪猫6 天前
第21章:微服务与分布式架构中的Go应用
后端·go·编程语言
怕浪猫8 天前
第20章:Web服务实战——构建RESTful API
后端·go·编程语言
Arjun11 天前
C语言基础内容整理
编程语言
怕浪猫11 天前
第19章:Go语言工具链与工程实践
后端·go·编程语言
番茄灭世神12 天前
Rust学习笔记第2篇
rust·编程语言