「STL::queue」标准库适配器:queue(队列)介绍(C++)

目录

概述

构造析构

赋值重构

数据访问

内存管理

数据控制

Tips


概述

queue 是一种C++标准模板库STL中定义的一种序列容器,它允许你在运行时动态地进行队列操作。

queue 可以自动管理内存,这意味着你可以添加任意多的元素在其中,并且你不需要手动分配和释放内存。

队列即是容器,也是适配器,它同时具有容器和适配器的特性:

动态大小:内存空间可以根据需要自动增长和缩小。

队列行为:栈总是执行先入先出原则。

元素容器:可以存储任何类型的元素,包括基本类型、对象、指针等。

关于队列的行为:

队列的显著特点是他的添加元素与删除元素操作:先加入的元素总是被先弹出。

一个队列应该应该是这样的:

          --------------QUEUE-------------
          ————     ————     ————     ————
pop() ←--  T1  ←--  T2  ←--  T3  ←--  T4  ←-- push()
          ————     ————     ————     ————     
          --------------------------------
         front()                     back()

Tn代表该元素被加入到队列的次序。

一个队列有以下四种基本行为:

front()表示对队列头元素的访问操作。如得到元素T1。

pop()表示对队列头元素的弹出操作。我们弹出T1

               ---------QUEUE---------
               ————     ————     ————
     pop() ←--  T2  ←--  T3  ←--  T4  ←-- push()
               ————     ————     ————     
               -----------------------
              front()           back()

现在T2成为队头元素。 

back()表示对队列尾元素的访问操作。如当前会得到T4。

push()表示对队列尾部压入新元素。我们压入T5

          --------------QUEUE-------------
          ————     ————     ————     ————
pop() ←--  T2  ←--  T3  ←--  T4  ←--  T5  ←-- push()
          ————     ————     ————     ————     
          --------------------------------
         front()                     back()

现在T5成为尾元素。 

接下来,我们介绍queue类型定义的成员函数。

*注意*:本文不涉及allocator空间配置器和C++23新增的range类函数。

创建销毁

STL库提供了以下方式创建一个queue。

T表示任意类型。

无参构造

queue<T>que();

生成一个存储T类型的队列queue。

提供容器的构造

queue<T,list<T>>que(const list& lst);

queue<T,deque<T>>que(const deque& deq);

从列出的两种容器中获得数据组成队列queue。

提供源数据地址的构造

(C++23)

queue<T>que(T* begin,T* end);

从定长数组(初末指针)或另一容器(初末迭代器)中获取数据进行构造。

需要注意的是,迭代器指向的容器需是一个提供随机访问迭代器的容器。

拷贝构造

queue<T>que(const queue& another);

将another整体赋值给新queue。

移动构造

queue<T>que(queue&& another);

窃取另一个queue容器,即直接获取它维护的底层指针地址,再将它的指针置空。

析构函数

~queue();

无须手动调用。程序自动在代码块结束时调用,清理掉queue。

赋值重构

在必要时我们会对queue进行重新初始化。

重载拷贝赋值=

queue& (const queue& another);

作用同拷贝构造。不仅可以在初始构造时使用。返回自身。

重载移动赋值=

queue& (queue&& another);

作用同移动构造。不仅可以在初始构造时使用。返回自身。

数据访问

queue对访问权限要求严格,你只能访问队头和队尾。

访问队头元素

front();

返回队头元素。

访问队尾元素

back();

返回队尾元素。

内存管理

queue仅有两个内存相关函数。

获取实际长度

size();

返回queue中的元素个数。

判断是否为空

empty();

size==0时返回true,否则返回false。

数据控制

数据控制是queue的核心。 

队尾压入

push(T elem);

在队尾压入元素。

队头弹出

pop_back();

弹出队头元素。

交换

(C++11)

swap(queue& another);

交换两个容器的元素。

安置(C++11)

emplace(T elem);

C++11后可用,原地构造一个元素,作用与push()相同,但没有赋值过程而是原地生成新元素,所以效率更高。

Tips

queue底层默认以deque双端队列方式实现,实际上,queue就是一个操作受限的deque。

同时,使用提供容器的构造来创建一个queue,queue底层就会以对应的方式实现。它不能算作C++标准容器,而是容器适配器,这是因为它只是对底层数据结构的接口进行了包装。

需要注意的是,vector不能作为queue的底层实现,因为它不提供pop_front()接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值