iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 容器适配器priority_queue怎么用
  • 871
分享到

C++ 容器适配器priority_queue怎么用

2023-06-14 17:06:04 871人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关c++ 容器适配器priority_queue怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。优先级队列(Priority Queue)队列是一种特征为FIFO的数据结构,每次从队列

这篇文章给大家分享的是有关c++ 容器适配器priority_queue怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

优先级队列(Priority Queue)

队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列

1. 优先级队列的概念

优先级队列的定义

优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。

优先级队列的特点
  •  优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值。

  • 当给每个元素分配一个数字来标记其优先级时,可设较小的数字具有较高的优先级,这样更方便地在一个集合中访问优先级最高的元素,并对其进行查找和删除操作。

  • 对优先级队列,执行的操作主要有:(1)查找,(2)插入,(3)删除。

  • 在最小优先级队列(min Priority Queue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素。

  • 在最大优先级队列(max Priority Queue)中,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。

  • 插入操作均只是简单地把一个新的元素加入到队列中。

  • 注:每个元素的优先级根据问题的要求而定。当从优先级队列中删除一个元素时,可能出现多个元素具有相同的优先权。在这种情况下,把这些具有相同优先权的元素视为一个先来先服务的队列,按他们的入队顺序进行先后处理。

 2.优先级队列的使用

头文件:#include < queue >
优先级队列默认是最大优先级队列

接口介绍

函数声明函数说明
priority_queue() / priority_queue(first, last)构造一个空的优先级队列
empty( )判断优先级队列是否为空,为空返回true
empty( )判断优先级队列是否为空,为空返回true
top( )获取优先级队列中最大或者最小的元素,即堆顶元素
push(x)将x元素插入到优先级队列中
pop()删除优先级队列中最大或者最小的元素, 即删除堆顶元素

测试代码:

void test(){priority_queue<int> pq;pq.push(13);pq.push(14);pq.push(9);pq.push(23);pq.push(12);pq.push(22);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;}

测试结果:默认是最大优先级队列,所以堆顶元素一直是最大的元素

C++ 容器适配器priority_queue怎么用

如何将创建最小优先级队列----
优先级队列原型:
泛型介绍T为优先级队列存储的数据类型;Container为优先级队列中存储数据的容器;Compare伪函数,决定是最大优先级队列还是最小优先级队列

template <class T, class Container = vector<T>,  class Compare = less<typename Container::value_type> > class priority_queue;

创建最小优先级队列:

priority_queue<int, vector<int>, greater<int>> pq;

测试结果:

C++ 容器适配器priority_queue怎么用

优先级队列存放自定义类型时,需要自定义类型支持比较的操作。

class A{public:A(int a = 1):_a(a){}//支持比较函数bool operator<(const A& a) const{return _a < a._a;}bool operator>(const A& a) const{return _a > a._a;}int _a;};

测试结果:

C++ 容器适配器priority_queue怎么用

C++ 容器适配器priority_queue怎么用

应用场景:Top-K问题
数组中的第K个最大元素
代码:

class Solution {public:    int findKthLargest(vector<int>& nums, int k)     {        priority_queue<int> pq(nums.begin(), nums.end());        while (--k)            pq.pop();        return pq.top();    }};

3.优先级队列的实现

标准容器类vector和deque(双端队列)满足实现优先级队列的需求,库中底层默认是使用Vector容器来实现的,我们现在就利用vector简单模拟实现

private:vector<T> con;

向下调整算法

向下调整算法用于优先级队列的删除接口的实现

void shiftDown(){int parent = 0;int child = 2 * parent + 1;while (child < con.size()){if (child + 1 < con.size() && con[child] < con[child + 1]){++child;}if (con[parent] < con[child]){swap(con[parent], con[child]);parent = child;child = 2 * parent + 1;}else{break;}}}

向上调整算法

向上调整算法用于优先级队列的插入接口的实现

//向上调整void shiftUp(int child){int parent = (child - 1) / 2;while (child > 0){if (con[parent] < con[child]){swap(con[parent], con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}

push()

  1. 将数据插入到容器的尾端

  2. 进行向上调整算法,建成堆

void push(const T& val){//尾插con.push_back(val);shiftUp(con.size() - 1);}

pop()

  • 将收尾数据进行交换

  • 删除末尾最后一个元素

  • 进行向下调整算法,建成堆

void pop(){//交换swap(con[0], con[con.size() - 1]);con.pop_back();shiftDown();}

top()、size()、empty()

都直接使用容器中的接口实现

T& top(){return con.front();}size_t size() const{return con.size();}bool empty() const{return con.empty();}

测试结果:

C++ 容器适配器priority_queue怎么用

但是我们的实现非常的死板,首先是不能创建最小优先级队列,其次是不能像底层实现一样,可以选择多种容器来存储数据来实现。

解决普通的优先级队列的两个问题

解决只能通过vector< T >来存储数据的问题
我们可以通过容器多添加一个泛型来解决多种容器的存储
priority_queue可以通过 vector< T >、deque< T >实现
默认使用vector< T >
原因:

  • list不支持随机访问迭代器的方式来访问元素

  • 与deque相比:deque随机访问效率低于vector

与之前代码需要修改的地方
1、泛型

template<class T, class Container = vector<T>>

2、所需要的容器

private:Container con;

C++ 容器适配器priority_queue怎么用

解决只能创建最大优先级队列问题
解决办法,加入新的泛型,该泛型是一个伪函数
如果不知道什么是伪函数,可以看看什么是伪函数,以及伪函数的使用
大小堆创建的不同其实就是在实现向上调整和向下调整时元素比较的不同而已。

与之前代码需要修改的地方
1、需要创建两个仿函数类

//用大最小优先级队列template<class T>struct Less{bool operator()(const T& a, const T& b){return a < b;}};//用于最小优先级队列template<class T>struct Greater{bool operator()(const T& a, const T& b){return a > b;}};

2、加入新泛型

template<class T, class Container = vector<T>, class Compare = Less<T>>
private:Compare cmp;

3、利用仿函数,替代代码中关键的比较的地方

C++ 容器适配器priority_queue怎么用
C++ 容器适配器priority_queue怎么用

测试结果:

C++ 容器适配器priority_queue怎么用
C++ 容器适配器priority_queue怎么用

完整代码

//用大最小优先级队列template<class T>struct Less{bool operator()(const T& a, const T& b){return a < b;}};//用于最小优先级队列template<class T>struct Greater{bool operator()(const T& a, const T& b){return a > b;}};template<class T, class Container = vector<T>, class Compare = Less<T>>class PriorityQueue{public://向下调整void shiftDown(){int parent = 0;int child = 2 * parent + 1;while (child < con.size()){if (child + 1 < con.size() && cmp(con[child], con[child + 1])){++child;}if (cmp(con[parent], con[child])){swap(con[parent], con[child]);parent = child;child = 2 * parent + 1;}else{break;}}}//向上调整void shiftUp(int child){int parent = (child - 1) / 2;while (child > 0){if (cmp(con[parent], con[child])){swap(con[parent], con[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& val){//尾插con.push_back(val);shiftUp(con.size() - 1);}void pop(){//交换swap(con[0], con[con.size() - 1]);con.pop_back();shiftDown();}T& top(){return con.front();}size_t size() const{return con.size();}bool empty() const{return con.empty();}private:Container con;Compare cmp;};

感谢各位的阅读!关于“C++ 容器适配器priority_queue怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: C++ 容器适配器priority_queue怎么用

本文链接: https://www.lsjlt.com/news/274091.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 容器适配器priority_queue怎么用
    这篇文章给大家分享的是有关C++ 容器适配器priority_queue怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。优先级队列(Priority Queue)队列是一种特征为FIFO的数据结构,每次从队列...
    99+
    2023-06-14
  • C++ 容器适配器priority_queue的使用及实现代码
    优先级队列(Priority Queue) 队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最...
    99+
    2024-04-02
  • C++ STL中容器适配器怎么实现
    这篇文章给大家分享的是有关C++ STL中容器适配器怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 stack1.1 stack 介绍 stack是一种容器适配器,专门用在具有后进先出操作的上...
    99+
    2023-06-14
  • C++ STL容器适配器使用指南
    目录适配器stack容器适配器✒️stack的介绍✏️stack的使用✏️stack的模拟实现queue✒️queue的介绍✏️queue的使用✏️queue的模拟实现deque容器...
    99+
    2024-04-02
  • C++ STL中的容器适配器实现
    1 stack 1.1 stack 介绍  stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 ...
    99+
    2024-04-02
  • C++容器适配器的概念与示例
    目录一. 什么是适配器与容器适配器二. 理解容器适配器stack的模拟实现queue的模拟实现一. 什么是适配器与容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的,多数人...
    99+
    2023-01-14
    C++容器适配器 C++适配器
  • C++中sort()函数和priority_queue容器的区别是什么
    这篇文章主要介绍“C++中sort()函数和priority_queue容器的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中sort()函数和priority_queue容器的区别...
    99+
    2023-07-05
  • C#适配器模式的使用
    目录前言适配器模式前言 我昨天做了个梦,我梦见我在一条路走,走的时候经过一个房间,里面关着一条边牧和鸡和猪,后来我醒了,我知道那只边牧就是小叶子(哈仔十一的边牧),小叶子具备牧羊和牧...
    99+
    2024-04-02
  • C#数据适配器DataAdapter
    一、填充数据 DataSet ds = new DataSet(); SqlCommand cmd = new SqlCommand("select * from Cato...
    99+
    2024-04-02
  • 深入探究C++中的容器适配器与仿函数技术
    目录一、容器适配器二、仿函数一、容器适配器 容器适配器其实是一种设计模式。转换出我们想要的东西。 比方说我们实现栈的时候既可以用数组,也可以用链表,此时我们就可以用到容器适配器了。 ...
    99+
    2023-05-17
    C++容器适配器 C++仿函数
  • Adapter适配器模式怎么应用
    这篇文章主要讲解了“Adapter适配器模式怎么应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Adapter适配器模式怎么应用”吧! Adapter(...
    99+
    2024-04-02
  • C++中sort()函数和priority_queue容器中比较函数的区别详析
    目录前言less情况greater情况自定义比较函数情况总结前言 普通的queue是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。priority_queue中元素被赋予...
    99+
    2023-03-07
    c++ 比较函数 c++ sort()函数 c++ priority_queue详解
  • PHP适配器模式怎么应用
    今天小编给大家分享一下PHP适配器模式怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。PHP 适配器模式讲解和代码示例...
    99+
    2023-07-05
  • C++怎么使用string容器
    本篇内容主要讲解“C++怎么使用string容器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么使用string容器”吧!string基本概念本质:string是c++风格的字符串,而s...
    99+
    2023-07-02
  • Android适配器notifyDataSetChanged()不能用怎么办
    如果在Android适配器中调用notifyDataSetChanged()方法没有任何效果,可能是由于以下几个原因: 数据源没...
    99+
    2024-03-01
    android
  • 怎么在C++项目中利用priority_queue自定义排序
    这篇文章给大家介绍怎么在C++项目中利用priority_queue自定义排序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,无论 priority_queue 中存储的是基础数据类型(int、double 等),...
    99+
    2023-06-06
  • C++容器适配与栈的实现及dequeque和优先级详解
    目录容器适配器栈的实现queque实现dequequedequeque的缺陷优先级队列习题优先级队列模拟实现仿函数容器适配器 我们可以看出,栈中没有空间配置器(内存池),而是适配器...
    99+
    2022-11-13
    C++容器适配 C++dequeque C++优先级
  • win7怎么更改vga适配器
    这篇文章主要介绍“win7怎么更改vga适配器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win7怎么更改vga适配器”文章能帮助大家解决问题。win7更改vga适配器的方法首先右键选择“计算机”...
    99+
    2023-07-01
  • PHP适配器模式Adapter Pattern怎么使用
    本篇内容主要讲解“PHP适配器模式Adapter Pattern怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP适配器模式Adapter Pattern怎么使用”...
    99+
    2023-07-05
  • C++怎么使用STL迭代器和容器
    这篇“C++怎么使用STL迭代器和容器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++怎么使用STL迭代器和容器”文章吧...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作