一、队列概述:

队列是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>第二步声明queuestd::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。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐