STL中的队列用法整理

news2024/12/27 18:24:04

STL中的队列

    • 先进先出队列(FIFO)
      • 主要方法
      • 代码示例
      • 输出
    • 优先级队列
      • 模版原型
      • 主要对方法有
      • 代码示例
        • int的大顶堆
        • 运行结果
        • int的小顶堆
        • 运行结果
      • 使用自定义的比较函数的优先队列
        • 代码示例
        • 运行结果
    • 双端队列
      • 主要方法
      • 示例
      • 运行结果
      • 有关双端队列的题目

先进先出队列(FIFO)

主要方法

  • (1)T front():访问队列的对头元素,并不删除对头元素

  • (2)T back():访问队列的末尾元素,并不删除末尾元素

  • (3)void pop():删除对头元素。

  • (4)void push(T):元素入队

代码示例

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    std::queue<int> myqueue;
    myqueue.push(1);   //入队
    myqueue.push(2);
    myqueue.push(3);
    cout<<"队列末尾元素:"<<myqueue.back(   <<endl;
    cout<<"队列元素出队顺序如下:";
    while(!myqueue.empty()) //判空
    {
        cout<<myqueue.front()<<"  ";    //访问队列头元素
        myqueue.pop();  //队列头元素出对
    }
    return 0;
}

输出

优先级队列

priority_queue就是优先级队列在STL中的模版,在优先队列中,优先级高的元素先出队列,内部使用实现(大顶堆,同Top K问题)。

模版原型

p r i o r i t y _ q u e u e < T , S e q u e n c e , C o m p a r e > priority\_queue<T,Sequence,Compare> priority_queue<T,Sequence,Compare>

  • T T T : 存放容器的元素类型

  • S e q u e n c e Sequence Sequence : 实现优先级队列的底层容器,默认是vector<T>

  • C o m p a r e Compare Compare : 用于实现优先级的比较函数,默认是functional中的less<T>

functional仿函数的应用(待补充)

初始化:

#include<bits/stdc++.h>
using namespace std;
int main(){
    priority_queue<int,vector<int>,less<int>> maxx; // 大顶堆 数据元素从大往小进行排序
    priority_queue<int,vector<int>,greater<int>> minn; //小顶堆 数据元素从小往大进行排序
}

主要对方法有

  • (1)T top():访问队列的对头元素,并不删除对头元素

  • (2)void pop():删除对头元素。

  • (3)void push(T):元素入队

代码示例

int的大顶堆

 #include <iostream>
 #include <queue>
 using namespace std;
 int main()
 {
   priority_queue<int> mypq;
   mypq.push(2);    //入队
   mypq.push(4);
   mypq.push(1);
   mypq.push(8);
   cout << "Popping out elements...";
   while (!mypq.empty())
   {
      cout << ' ' << mypq.top();    //读取队列头元素
      mypq.pop();   //对头元素出队列
   }
   cout << '\n';
   return 0;
 }

运行结果

int的小顶堆

 #include <iostream>
 #include <queue>
 using namespace std;
 int main()
 {
   priority_queue<int,std::vector<int>,greater<int>> mypq;
   mypq.push(2);    //入队
   mypq.push(4);
   mypq.push(1);
   mypq.push(8);
   cout << "Popping out elements...";
   while (!mypq.empty())
   {
      cout << ' ' << mypq.top();    //读取队列头元素
      mypq.pop();   //对头元素出队列
   }
   cout << '\n';
   return 0;
 }

运行结果

使用自定义的比较函数的优先队列

更加详细的自定义比较函数的做法(待补充)

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,大的优先级高,优先输出。

我们只要重写<操作符就可以啦。

代码示例

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Student
{
    string name;
    int score;
};
class cmp{
public:
    bool operator()(Student &a, Student &b){
        return a.score<b.score; //成绩高者优先
    }    
};
void xianshi(Student a){
    cout<<"成绩最高者为:"<<a.name<<' '<<a.score<<endl;
}
int main()
{
    priority_queue<Student,vector<Student>,cmp> sq;  
    // 利用优先队列可以快速的获得自己想要的优先级最高的数据
    Student stu1,stu2,stu3,stu4;
    stu1.name = "小明"; stu1.score = 59;
    sq.push(stu1);
    xianshi(sq.top());
    stu2.name = "小花"; stu2.score = 88;
    sq.push(stu2);
    xianshi(sq.top());
    stu3.name = "小黑"; stu3.score = 99;
    sq.push(stu3);
    xianshi(sq.top());
    stu4.name = "Bob"; stu4.score = 55;
    sq.push(stu4);
    xianshi(sq.top());
    return 0;
}

运行结果

双端队列

双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。deque是STL中双端队列模版。

主要方法

  • (1) void pop_front():从队列头部删除元素

  • (2) void pop_back():从队列删除元素

  • (3) void push_front(T):从队列头部插入元素

  • (4) void push_back(T):从队列尾部插入元素

  • (5) T front():读取队列头部元素

  • (6) T back(T):读取队列尾部元素

示例

#include <iostream>
#include <deque>
using namespace std;
int main ()
{
   deque<int> mydeque;
   mydeque.push_back (2);    //队列尾部插入
   mydeque.push_back (4);
   mydeque.push_back (3);
   mydeque.push_front(1);    //队列头部插入
 
   cout << "Popping out the elements in mydeque:";
   while (!mydeque.empty())
   {
     cout << ' ' << mydeque.front();
     mydeque.pop_front();    //删除队列头部
   }
   cout << "\nThe final size of mydeque is " << int(mydeque.size()) << '\n';
   return 0;
}

运行结果

有关双端队列的题目

题目链接:813. 句子相似性 III

class Solution {
public:
    bool areSentencesSimilar(string sentence1, string sentence2) {
        deque<string> s1,s2;
        stringstream ss1(sentence1);
        stringstream ss2(sentence2);
        string t;
        while(ss1>>t){s1.push_back(t);}
        while(ss2>>t){s2.push_back(t);}
        bool ans = 0;
        while(1){
            bool f1 = 1,f2 = 1;
            if(s1.empty()==1||s2.empty()==1){
                ans = 1;break;
            } 
            if(s1[0]==s2[0]){
                s1.pop_front();
                s2.pop_front();
            }else{f1 = 0;}
            if(s1.empty()==1||s2.empty()==1){
                ans = 1;break;
            } 
            if(s1[s1.size()-1]==s2[s2.size()-1]){
                s1.pop_back();
                s2.pop_back();
            }else{f2 = 0;}          
            if(f1==0&&f2==0){
                ans = 0;break;
            }
        }
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue生命周期,总也学不会,所以我详细整理了一下

今天&#xff0c;我和大家一起来对vue生命周期做一个整理和思考&#xff0c;希望有缘人看到我的年度整理和思考&#xff0c;如果觉得靠谱呢&#xff0c;就交个朋友&#xff0c;如果觉得我整理的不足&#xff0c;就请指出&#xff0c;让我们一起进步&#xff0c;让我们2023年能共…

单链表

插入&#xff1a; head 表示头结点的下标 e[i] 表示节点i的值 ne[i] 表示节点i的next指针是多少 idx 存储当前已经用到了哪个点 步骤&#xff1a;1.初始化head 2.将x插到头结点 3.插入&#xff1a;将x插到下标是k的点后面 4.将x插到下标是k的点后面 5.将下标是k的点后面…

springboot,vue影院订票系统

开发工具&#xff1a;IDEA服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7系统用户前台和管理后台两部分&#xff0c;项目采用前后端分离前端技术&#xff1a;vue elementUI服务端技术&#xff1a;springbootmybatis项目功…

集合框架及背后的数据结构

集合框架及背后的数据结构1. 介绍2. 学习的意义2.1 Java 集合框架的优点及作用2.2 笔试及面试题3. 接口 interfaces3.1 基本关系说明3.2 Collection 接口说明3.3 Collection 常用方法说明3.4 Collection 示例3.5 Map 接口说明Map3.6 Map 常用方法说明3.7 Map 示例4. 实现 class…

免费AI改图神器,一个万能宝藏在线工具箱

说到工具箱&#xff0c;无论是在线工具&#xff0c;还是软件应用都非常多。 比如想要抠一张图片&#xff0c;如果专业处理&#xff0c;那么会使用到 Photoshop&#xff0c;需要一定的学习成本&#xff0c;想要更快捷处理&#xff0c;那么会直接使用在线工具&#xff0c;网络上…

Secret

目录 文章目录目录本节实战前言1、Opaque Secret1.创建Secret&#xff08;1&#xff09;通过data字段来创建secret资源对象&#xff08;2&#xff09;通过stringData字段来创建secret资源对象&#xff08;3&#xff09;通过kubectl create命令来创建Opaque类型的Secret资源2.使…

ROS2 基础概念 参数

ROS2 基础概念 参数1. Parameters2. 参数3. 参数查看4. 参数设置5. 参数保存6. 参数加载1. Parameters 指令功能ros2 param delete /node parameter删除参数值ros2 param describe /node parameter显示参数的相关描述ros2 param dump /file将参数保存到一个文件中ros2 param g…

LinuxDeployQT打包QT程序

系统&#xff1a;ubuntu20.04官网可直接下载使用https://github.com/probonopd/linuxdeployqt/releases&#xff0c;但是因为不支持ubuntu20所以本文通过下载源码编译的方式编译linuxdeployqt安装编译相关依赖sudo apt-get install git g libgl1-mesa-dev wget安装QTsudo apt-g…

大数据之Kafka Shell命令和Java API

文章目录前言一、Kafka相关Shell命令&#xff08;一&#xff09;创建并查询Topic&#xff08;二&#xff09;删除Topic&#xff08;三&#xff09;增加Topic的分区&#xff08;四&#xff09;生产数据到Topic&#xff08;五&#xff09;从Topic消费数据总结前言 #博学谷IT学习…

机器学习笔记之深度玻尔兹曼机(一)玻尔兹曼机系列整体介绍

机器学习笔记之深度玻尔兹曼机——玻尔兹曼机系列整体介绍引言关于含隐变量模型的对数似然梯度玻尔兹曼机受限玻尔兹曼机深度信念网络深度玻尔兹曼机引言 从本节开始&#xff0c;将介绍玻尔兹曼机系列的最后一个模型——深度玻尔兹曼机(Deep Boltzmann Machine,DBM) 关于含隐…

【状态设计优化DP】P4310 绝世好题

不愧是绝世好题和abc那道E一样&#xff0c;也是重新定义状态来优化转移复杂度的DP(56条消息) Atcoder Beginner Contest E - Work or Rest_lamentropetion的博客-CSDN博客这种其实就是通过转移方式的特殊性来设计状态&#xff0c;从而降低复杂度其实我感觉降低复杂度优化就是因…

数据结构——括号匹配问题

这是一道常见的经典的数据结构中栈的问题。题目&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;我们运用C语言实现这个问题。有效括号调用栈由于要涉及到栈的问题&#xff0c;不可避免的要运用栈的函数接口。比较直接的方法是&#xff0c;直接复制 栈 的代…

通过windows程序计划设定nginx开机自启动

通过windows程序计划设定nginx开机自启动1、按下win键输入计划&#xff0c;回车2、找到windows目录&#xff0c;在当下目录创建新任务3、自定义名称描述4、将触发设定为开机自启动5.点击下一步&#xff0c;程序或脚本选择nginx.exe所在目录&#xff0c;要把下面的起始于 处填上…

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树

算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树 最大二叉树 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值…

《Linux Shell脚本攻略》学习笔记-第十一章

11.1 简介 本章将会讲述如何获取相关网络分组。CPU占用率、磁盘使用情况以及东台调用的更多信息。 11.2 使用tcpdump跟踪分组 tcpdump需要以root身份运行。 关键字port可以只显示出发往或者来自特定端口的分组 src修饰符配合特定的“关键字-值”就可以指定源文件中的这类分组。…

Linux chown 命令

Linux chown&#xff08;英文全拼&#xff1a;change owner&#xff09;命令用于设置文件所有者和文件关联组的命令。Linux/Unix 是多人多工操作系统&#xff0c;所有的文件皆有拥有者。利用 chown 将指定文件的拥有者改为指定的用户或组&#xff0c;用户可以是用户名或者用户 …

基于机器学习 实现APT 检测(附完整代码)

项目环境概述以机器学习的方式&#xff0c;可以通过多种模型对 APT 组织所使用的恶意代码进行训练学习&#xff0c;同时由于训练的多样化&#xff0c;检测效果也会比家好。本项目采用的随机森林以及不同采样策略进行模型训练。详细设计见md文件。1.系统描述本系统主要是针对大量…

ElementUI中树形表格下拉卡死的问题解决

文章目录错误现象与描述&#xff1a;代码案例&#xff1a;错误现象与描述&#xff1a; 最近在修改一个前端的问题&#xff0c;发现后台返回给前端有数据&#xff0c;SQL查询也很快&#xff0c;但是就是前端的表格这里一直卡死&#xff0c;后来发现其他数据正常&#xff0c;其中…

【代码随想录】343. 整数拆分

343. 整数拆分 动态规划五部曲 1. 确定dp数组以及下标的含义 dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 2. 确定递推公式 其实可以从1遍历j&#xff0c;然后有两种渠道得到dp[i]. 一个是j * (i - j) 直接相乘。 一个是j * dp[i - j]&#xff0c;相…

文本向量化

1、one-hot 在one-hot里面每一个token用一个长度为N向量表示&#xff0c;N表示的是词典的数据量。&#xff08;不重复的词数量&#xff09; 缺点&#xff1a;维度太高&#xff0c;用稀疏向量表示文本。 2、word embedding 使用float的矩阵来表示token&#xff0c;根据词典的…