项目1:队列的讲解(上):C++队列的使用
摘要:队列是一种遵循先进先出(FIFO)原则的线性数据结构,广泛应用于多线程通信、缓存管理等领域。其核心操作包括从队尾入列、队头出列,确保数据顺序性。C++标准库提供了队列API,包含front()、back()、push()、pop()等基本操作,简化了队列实现。通过队列缓冲机制可有效解决音视频解码中的数据处理问题,提升系统性能。代码示例展示了STL队列的基本使用方法,包括初始化、入队出队等操作
一、队列概述:
队列是C/C++中一种基础且重要的线性数据结构。其核心特性是遵循先进先出(FIFO)原则,即元素从队尾(rear)入列,从队头(front)出列,类似于现实生活中的排队场景。这种特性使队列在软件开发中具有广泛的应用价值,包括但不限于多线程通信、缓存管理、中间件架构等关键场景。

如图所示,队列尾部依次入队了三个元素:1、2、3。其中1是最早入队的元素,2次之,3最后入队。出队时,1号元素最先出队(pop1),其次是2号(pop2),最后是3号(pop3)。由此可见,队列这种数据结构能够确保数据的顺序性,避免出现乱序问题。
二.队列的用处:
队列在多线程编程中发挥着重要作用,主要用于实现数据传输、解耦和缓存等功能。在大型项目中,多个线程往往需要协同工作时,队列便充当了线程间通信的桥梁(如图一所示)。具体实现方式是:线程一将数据包按顺序存入队列,而线程二和线程三则按相同顺序从队列中获取数据。

(图一)
除了用于线程通信,队列在数据缓冲方面也发挥着重要作用。以音视频解码为例,当大量数据涌入解码端时,若没有缓冲机制,解码端可能因处理速度不足导致画面出现花屏或卡顿。通过引入队列缓冲,可以有效降低数据传输速率,减轻解码端压力,从而显著提升画面质量。具体实现流程详见图二所示。

三.C++ STL队列的用法:
C++库已经提供了一套队列的api方便开发者进行开发,这样我们就不用重新再新造轮子去实现队列。下面我们就来看看我们用stl queue去实现队列:
3.1.queue的初始化:
#include <queue>
std::queue<object> object_queue;
初始化stl的queue,需要做两步。第一步要包含<queue>头文件,#include<queue>; 第二步声明queue,std::queue<object> object_queue。这里的<object>里面的object是任意类型的数据,也包括结构体的数据。
3.2.queue的操作api:
front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop():删除 queue 中的第一个元素。
size():返回 queue 中元素的个数。
empty():如果 queue 中没有元素的话,返回 true。
emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。
3.3.queue的demo
#include <stdio.h>
#include <queue>
using namespace std;
int main()
{
queue<int > Q;
for(int i=0;i<5;i++){
Q.push(i);//0,1,3,4,5,6这几个元素依次压入队列
}
Q.pop();//出队元素0
Q.pop();//出队元素1
Q.pop();//出队元素2
Q.pop();//出队元素3
Q.pop();//出队元素4
printf("%d",Q.front());
return 0;
}
上面这个是一个简单的stl queue操作,先入队6个元素(0-6)。然后再连续出队pop,这里总共出队了5次,此时元素0 1 2 3 4全部出队并删除,所以打印front的元素是5。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)