蓝桥杯:C++队列、优先队列、链表

C++普通队列

算法竞赛中一般用静态数组来模拟队列,或者使用STL queue。使用C++的STL queue时,由于不用自己管理队列,因此代码很简洁。队列的部分操作如下。

C++优先队列

很多算法需要用到一种特殊的队列:优先队列。它的特点是最优数据始终位于队首。

优先队列的效率很高:新数据插入队列生成新的最优队首元素,计算复杂度是O(logn);弹出最优的队首元素后在队列中计算出新的最优队首元素,计算复杂度也是O(logn)。

C++ STL优先队列priority_queue用堆来实现,堆是用二叉树实现的一种数据结构。

定义:priority_queue<Type, Container, Functional>。

Type是数据类型,Container是容器类型(用数组实现的容器,默认是vector),Functional是比较的方式。当需要使用自定义的数据类型时才需要传入这3个参数,而使用基本数据类型时,只需要传入数据类型,默认是大顶堆,堆顶是最大值。

C++链表

链表的编程实现有动态链表、静态链表、STL list等多种方法。在算法竞赛中,为了加快编程速度,一般使用静态链表或STL list。

STL list:

如果读者嫌麻烦,则可以使用C++的STL list,这样就不用自己管理链表。非常方便,本文也是直接讲解STL list,加快在算法竞赛中的编程速度。

STL list是双向链表,通过指针访问结点数据,它的内存空间可以是不连续的,使用它能高效地删除和插入结点。就此意义而言,list是真正的链表。

list中的构造函数:

list() 声明一个空列表;

list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的

list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的

list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素

常用函数:

**begin()和end():**通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。

**push_back() 和push_front():**使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。

**empty():**利用empty() 判断list是否为空。

resize(): 如果调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除,如果需要扩展那么调用默认构造函数T()将元素加到list末端。如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造,其余部分相同。

clear(): 清空list中的所有元素。

**front()和back():**通过front()可以获得list容器中的头部元素,通过back()可以获得list容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。

**pop_back和pop_front():**通过删除最后一个元素,通过pop_front()删除第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。

**swap():**交换两个链表(两个重载),一个是l1.swap(l2); 另外一个是swap(l1,l2),都可能完成连个链表的交换。

**reverse():**通过reverse()完成list的逆置。

**merge():**合并两个链表并使之默认升序(也可改),l1.merge(l2,greater<int>()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序。其实默认是升序,greater<int>()可以省略,另外greater<int>()是可以变的,也可以不按升序排列。

**insert():**在指定位置插入一个或多个元素(三个重载):

l1.insert(l1.begin(),100); 在l1的开始位置插入100。

l1.insert(l1.begin(),2,200); 在l1的开始位置插入2个100。

l1.insert(l1.begin(),l2.begin(),l2.end());在l1的开始位置插入l2的从开始到结束的所有位置的元素。

**erase():**删除一个元素或一个区域的元素(两个重载)

l1.erase(l1.begin()); 将l1的第一个元素删除。

l1.erase(l1.begin(),l1.end()); 将l1的从begin()到end()之间的元素删除。

相关推荐
----云烟----5 分钟前
QT中QString类的各种使用
开发语言·qt
lsx2024069 分钟前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic34 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it35 分钟前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康40 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
搬砖的小码农_Sky1 小时前
C语言:数组
c语言·数据结构
机器视觉知识推荐、就业指导1 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
宅小海2 小时前
scala String
大数据·开发语言·scala
qq_327342732 小时前
Java实现离线身份证号码OCR识别
java·开发语言