queue

queue就是队列,在STL中是实现了一个先进先出的容器,要使用queue,需要在加上queue这个头文件。

queue的定义,queue<typename> q;其中typename可以为任何类型或容器。

queue的访问,由于队列是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素,或是通过back()来访问队尾元素。

queue<`int`> q ;
    for(int i=1;i<5;i++){
        q.push(i) ;
    }
    cout << q.front() << endl ;
    cout << q.back() << endl ;
    输出结果:1
4

Queue常用函数
(1) push(),push(x)将x入队,时间复杂度O(1)
(2) front(),访问队首元素,back()访问队尾元素,时间复杂度O(1)。
(3) pop(),令队首元素出队,时间复杂度O(1)。

queue<int> q ;
    for(int i=1;i<5;i++){
        q.push(i) ;
    }
    q.pop() ;
    cout << q.front() << endl ;
    cout << q.back() << endl ;
输出结果:2
4
(4) empty(),判断队列是否为空,如果是空则返回true,否则返回false。
(5) size(),返回queue内元素的个数,时间复杂度为O(1)。

queue<int> q ;
    for(int i=1;i<5;i++){
        q.push(i) ;
    }
    if(!q.empty()){
        cout << q.size() ;
    }
输出结果:4

Queue的常见用途:
    当需要实现广度优先搜索时,可以不用自己手工实现一个队列。在使用front()和pop()函数前,必须使用empty()判断队列是否为空,否则可能因为队空而出现错误。

priority_queue
priority_queue又称优先队列,其底层是用堆来进行实现的。在优先队列中,队首的元素一定是当前队列中优先级最高的那一个。C++中的堆默认是大跟堆。

priority_queue的定义,priority_queue<typename> q,typename可以为任意类型的元素。要使用优先队列,应先添加头文件#include[HTML_REMOVED]。
Priority_queue只能通过top()函数来访问队首元素(堆顶元素),也就是优先级最高的元素。

priority_queue<int> q ;
    q.push(3) ;
    q.push(1) ;
    q.push(5) ;
    cout << q.top() << endl ;
输出结果:5

Priority_queue常用函数
(1) push(x),时间复杂度O(logN),N是堆中元素的个数。
(2) top(),top()可以获得队首元素,时间复杂度O(1)
(3) pop(),令堆顶元素出队,时间复杂度O(logN),其中N是堆中的元素个数。

priority_queue<int> q ;
    q.push(3) ;
    q.push(1) ;
    q.push(5) ;
    cout << q.top() << endl ;
    q.pop() ;
    cout << q.top() << endl ;
输出结果:5
3

(4) empty(),判断队列是否为空,为空返回true,否则返回false。
(5) size(),返回优先队列中元素的个数,时间复杂度O(1)

priority_queue<int> q ;
    q.push(3) ;
    q.push(1) ;
    q.push(5) ;
    if(!q.empty()){
        cout << q.size() << endl ;
    }
输出结果:3
Priority_queue内元素的优先级设置
    如何定义优先队列内元素的优先级是运用好优先队列的关键,下面分别介绍几本数据类型和结构体类型的优先级设置方法。

(1)基本数据类型的优先级设置
基本数据类型的优先级设置方法是类似的,这里用int举例。在C++中默认情况下是大根堆,所以下面两种优先队列的定义是等价的。
Priority_queue<int> q,priority_queue<int,vector<int>,less<int>> q;
可以发现第二种定义方式,后面多了两个参数,一个是vector<int>,另一个是less<int>。其中vector<int>填写的是来承载底层数据结构heap(堆)的容器;第三个参数less<int>则是对第一个参数的比较类,less[HTML_REMOVED]表示数字越大优先级越高,而greater<int>表示数字越小的优先级越大。因此,C++中定义小根堆的方式是,priority_queue<int,vector<int>,greater<int>> q。

priority_queue<int,vector<int>,greater<int>> q ;
    q.push(3) ;
    q.push(1) ;
    q.push(5) ;
    cout << q.top() << endl ;
输出结果:1
(2) 结构体的优先级设置
对结构体进行优先级设置有两种方式,第一种是在结构体内部重载小于号“<”,第二种方式是在结构体外部重载“()”,下面对这两种情况分别举个例子来说明
重载小于号“<”

struct fruit{
    string name ;
    int price ;
    friend bool operator < (fruit f1,fruit f2){
        return f1.price > f2.price ;
    }
};
priority_queue<fruit> q ;
    q.push({"apple",8}) ;
    q.push({"orange",7}) ;
    q.push({"banana",9}) ;
    auto ele = q.top() ;
    cout << ele.name << ' ' << ele.price << endl ;
输出结果:orange 7
这种情况下优先队列只能采用第一种定义方式。
重载小括号“()”

struct fruit{
    string name ;
    int price ;
};
struct cmp{
    bool operator () (fruit f1,fruit f2){
        return f1.price > f2.price ;
    }
};
int main(){

priority_queue<fruit,vector<fruit>,cmp> q ;
    q.push({"apple",8}) ;
    q.push({"orange",7}) ;
    q.push({"banana",9}) ;
    auto ele = q.top() ;
    cout << ele.name << ' ' << ele.price << endl ;
    return 0 ;
}
输出结果:orange 7
这里的优先队列只能采用第二种定义方式。
小结,即使是基本数据类型或者STL容器,也可以通过同样的方式来定义优先级。
注意:如果结构体内的数据比较庞大,建议使用引用来提高效率,此时比较类的参数中需要加上“const”和“&”,如下所示:

friend bool operator < (const fruit& f1,cosnt fruit& f2){
        return f1.price > f2.price ;
    }
bool operator () (const fruit& f1,const fruit& f2){
        return f1.price > f2.price ;
    }
Priority_queue的常见用途
    Priority_queue可以解决一些贪心问题,也可以对dijkstra进行优化(因为优先队列的本质是堆),在使用top()函数前

C++常用标准模板库——queue相关推荐

  1. C++常用标准模板库——algorithm

    algorithm 使用algorithm头文件,需要在头文件下面加一行"using namespace std",才能使用. algorithm的常用函数 (1) max(),m ...

  2. c++标准模板库STL【快速查找】【最全】【常用】【语法】

    c++标准模板库STL[快速查找][最全][常用][语法] c标准模板库STL快速查找最全常用语法         vector- 变长数组         set-内部自动有序且不含重复元素     ...

  3. C++提高编程----STL标准模板库-常用容器

    STL标准模板库(Standard Template Library)-常用容器 C++的,面向对象和泛型编程,目的就是提高代码的复用性:为了建立数据结构和算法的统一标准,诞生了STL 一.STL初识 ...

  4. 【常用技巧】标准模板库(STL)

    [常用技巧]标准模板库(STL) 在前几个章节中我们已经使用了诸如队列.堆.堆栈.vector 等标准模板库中的模板,切身感受到了它给我们带来的极大便利.在本节中,我们还要介绍两种标准模板--stri ...

  5. stl标准模板库_C ++标准模板库(STL)中的数组及其常用功能

    stl标准模板库 "array" is a container in C++ STL, which has fixed size, which is defined in &quo ...

  6. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  7. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  8. STL学习系列一:STL(标准模板库)理论基础

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...

  9. c++ 的 stl模板库_C ++中的标准模板库(STL)

    c++ 的 stl模板库 Standard Template Library (STL) is a collection of standard C++ template classes. It co ...

最新文章

  1. C++的STL栈实现获取栈中最小元素的成员
  2. [SimpleOJ238]宝藏探寻
  3. Activiti工作流从入门到入土:整合spring
  4. maven开发工具安装
  5. 用AI击破传统行业痛点 “百度大脑行业创新论坛”将提7大行业解决方案
  6. Delphi:ADOConnection连接SQLServer自动断网问题解决
  7. oracle技术之顺序文件上的索引(一)
  8. 多项目加载顺序修改_React推出并发模式:可中断渲染、指定加载顺序、并行处理多状态...
  9. Linux find命令、Linux rmdir命令、Linux ls命令
  10. html5把六张图片做成立方体,HTML5绘制在立方体上的几何曲线图形
  11. (CVPR_2021) Center-based 3D Object Detection and Tracking
  12. react代码编辑器 react-ace
  13. 51单片机12864液晶显示模块控制
  14. python 爬虫 爬取 小米有品 全网 商品数据
  15. 2023年1月21日除夕活动取消通知
  16. 山东省中小企业数字化转型论坛成功举办,九州云赋能中小企业数智升级
  17. 3Dmax入门篇,常用快捷命令及两种基础建模方式,小白看了都会!
  18. 社区运营秘笈:病毒式营销!
  19. 编程之美-翻烙饼问题
  20. js中[object,object]是什么,怎么取值

热门文章

  1. 见证历史!苹果官宣:Mac 正式踢开 Intel,iOS 与 macOS 全面融合,但它还在向微信学习...
  2. 哈夫曼(huffman)压缩算法,非常易懂
  3. 陌陌三季度财报有哪些亮点?
  4. JAVA 重定向 Respone.sendRedirct Cookies丢失
  5. Photoshop 字体
  6. iphone技巧之cydia重新进去时不用重新加载
  7. Java线程中sleep()、wait()和notify()、suspend()和resume()、yield()、join()、interupt()的用法和区别
  8. 什么是谷歌应用引擎(GAP)
  9. python十大框架_python 十大web框架排名总结
  10. java培训记录Day09 2022/3/22星期二(数组)