【C++】队列(queue)的使用

2023-11-01

一、queue 简介

C++ 中,std::queue 容器是一种先进先出(First In First Out, FIFO)的数据结构,且有两个出口。

队列(queue)的结构如下:类似于生活中的排队买票,最先排队的人位于队伍最前端,后来的人依次从队伍末尾加入队伍。当队首的人买票成功后离开,原先位于第二位的人顶上成为新的队首,后续以此类推。

二、queue 构造函数

构造函数原型 解释
1 queue<T> que 默认构造
2 queue(const queue &que) 拷贝构造

三、queue 赋值操作

函数原型:= 解释
1 queue& operator=(const queue &que) 重载=操作符

四、queue 数据存取

函数原型:push、pop、back、front 解释
1 push(elem) 向队尾添加元素
2 emplace() 向队尾添加元素
3 pop() 移除当前队首元素
4 back() 返回队尾元素
5 front() 返回队首元素

注意:

  • push与emplace区别详见 :push与emplace异同点
  • std::queue 不提供迭代器访问元素,只能通过 front()back() 来访问队列的第一个和最后一个元素。
  • std::queue 不支持随机访问,不能通过索引访问队列中的元素。
  • std::queue 的底层容器可以在创建时指定,例如使用 std::list 作为底层容器:std::queue<int, std::list<int>> myQueue;

五、queue 其他操作

函数原型:empty、size、swap 解释
1 empty() 判断队列是否为空
2 size() 返回队列的大小
3 swap(queue<T> & que) 将当前队列中元素和que中元素交换

注意: swap()交换的两个队列中包含元素的类型必须相同。

示例:

#include <iostream>
#include <string>
#include <queue>       //必须包含该头文件
using namespace std;

class ObjNumber
{
public:
	string m_objName;
	int m_number;
public:
	ObjNumber(string name, int num)
	{
		m_objName = name;
		m_number = num;
	}
};

void test01()
{
	queue<ObjNumber> s1;
	ObjNumber obj1("茶叶", 1);

	s1.push(obj1);    //push必须填入实例化的对象

	s1.emplace(obj1); //emplace既可以填入实例化的对象
	s1.emplace("馒头", 2);  //emplace也可以填入构造函数的参数

	cout << "s1中元素数量为:" << s1.size() << endl;
	while (!s1.empty())
	{
		cout << "队首元素:" << s1.front().m_objName << endl;
		s1.pop();   //弹出队首元素
	}
}

int main()
{
	test01();
	system("pause");
	return 0;
}
//result
s1中元素数量为:3
队首元素:茶叶
队首元素:茶叶
队首元素:馒头

六、queue 总结分析

注意:优劣是相对的,取决于具体的使用场景和需求。

优势:

  1. 简单易用:std::queue 提供了一组简单的接口函数,如 push()pop()front()empty() 等,使用起来非常方便。
  2. 高效性:std::queue 基于底层容器实现,通常使用 std::dequestd::list 作为默认的容器。这些容器都提供了高效的插入和删除操作,使得 std::queue 在大多数情况下具有良好的性能。
  3. 内存管理:std::queue 的底层容器会自动管理内存,当元素被弹出队列后,相关的内存也会被释放,无需手动管理内存。
  4. 无迭代器失效问题:由于 std::queue 的特性是先进先出,插入和删除操作只能在队尾和队首进行,因此不会导致迭代器失效的问题。

劣势:

  1. 功能受限:std::queue 只提供了队列的基本功能,即在队尾插入元素、在队首删除元素。如果需要在任意位置插入或删除元素,就需要选择其他容器,如 std::liststd::vector
  2. 不支持遍历:std::queue 不支持直接遍历队列中的元素,也无法通过索引访问队列中的特定元素。如果需要对队列进行遍历或随机访问元素,需要使用其他容器或将队列转换为其他容器进行操作。

总结:std::queue 是一个简单、高效的队列容器,适用于需要按照先进先出顺序处理元素的场景。它在插入和删除操作上具有良好的性能,且无需手动管理内存。然而,由于功能受限,如果需要在任意位置插入或删除元素,或需要遍历队列中的元素,就需要选择其他更适合的容器。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】队列(queue)的使用 的相关文章

随机推荐