一、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 总结分析
注意:优劣是相对的,取决于具体的使用场景和需求。
优势:
- 简单易用:
std::queue
提供了一组简单的接口函数,如push()
、pop()
、front()
、empty()
等,使用起来非常方便。 - 高效性:
std::queue
基于底层容器实现,通常使用std::deque
或std::list
作为默认的容器。这些容器都提供了高效的插入和删除操作,使得std::queue
在大多数情况下具有良好的性能。 - 内存管理:
std::queue
的底层容器会自动管理内存,当元素被弹出队列后,相关的内存也会被释放,无需手动管理内存。 - 无迭代器失效问题:由于
std::queue
的特性是先进先出,插入和删除操作只能在队尾和队首进行,因此不会导致迭代器失效的问题。
劣势:
- 功能受限:
std::queue
只提供了队列的基本功能,即在队尾插入元素、在队首删除元素。如果需要在任意位置插入或删除元素,就需要选择其他容器,如std::list
或std::vector
。 - 不支持遍历:
std::queue
不支持直接遍历队列中的元素,也无法通过索引访问队列中的特定元素。如果需要对队列进行遍历或随机访问元素,需要使用其他容器或将队列转换为其他容器进行操作。
总结:std::queue
是一个简单、高效的队列容器,适用于需要按照先进先出顺序处理元素的场景。它在插入和删除操作上具有良好的性能,且无需手动管理内存。然而,由于功能受限,如果需要在任意位置插入或删除元素,或需要遍历队列中的元素,就需要选择其他更适合的容器。文章来源:https://www.toymoban.com/news/detail-701031.html
如果这篇文章对你有所帮助,渴望获得你的一个点赞!
文章来源地址https://www.toymoban.com/news/detail-701031.html
到了这里,关于【C++】队列(queue)的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!