一. 队列的介绍:
队列是C/C++中最基础的数据结构之一,队列本质上是一种线性表。它遵循着先进先出(fifo)的特点,在队列中一般在队尾插入,队头出队。这就相当于排队一样,刚入队的人需要排在队尾(rear),每次出队的都是在队首(front)。
从上面这张图我们可以看到,队尾入队了三个元素分别是1,2,3。1号数据最早入队、2号数据第二入队、3号数据最后入队。出队的时候,1号最早出队(pop1)、2号排在1号数据后面(pop2)、3号最后出队(pop3)。所以使用队列的时候,我们可以保证数据的顺序不会出现乱序的错误。
二. 队列的用处:
队列常用于在多线程数据传输、数据解耦、缓存数据等方面。由于在大型的项目开发中,往往有许多线程同时运作。此时,许多线程之间需要进行数据的传递,所以此时我们就需要通过队列作为一条桥梁把数据从一个线程送到另外一个线程里面(如下图一就是队列在两个线程之间的通信)。线程一把数据按照顺序把数据包存储到Queue上、线程二、三也按照顺序从队列拿到数据。
(图一)
除了线程之间通信之外,队列还常用于数据量缓存方面。比方说,在音视频解码的时候,音视频数据会大量传入解码端。假设此时没有一个缓冲的时间,解码端可能会因为处理速度的问题,导致解码视频的时候会出现花屏、卡顿等问题。所以,此时我们就需要用队列进行缓冲,使其传输速度降下来,那解码端的解码压力就会大大降下来,此时解码出来的画面质量就会高很多,具体的流程如图二。
(图二)
三.C++ STL队列的用法:
C++库已经提供了一套队列的api方便开发者进行开发,这样我们就不用重新再新造轮子去实现队列。下面我们就来看看我们用stl queue去实现队列:
3.1. queue****的初始化:
#include
std::queue
初始化stl的queue,需要做两步。第一步要包含
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
3.4.queue****的demo
上面这个是一个简单的stl queue操作,先入队6个元素(0-5)。然后再连续出队pop,这里总共出队了4次,此时元素0 1 2 3全部出队并删除,所以打印front的元素是4。
在C++ STL库中,front()函数和pop()函数都是用于访问和操作容器的元素。但是它们的作用不同:
front()函数返回容器的第一个元素,而不会从容器中移除该元素。
pop()函数从容器中移除第一个元素,并且没有返回值。
因此,可以使用front()来查看容器中的第一个元素,而不改变容器的内容,然后使用pop()函数将其从容器中删除。