C++ 优先队列priority_queue(同一优先级数据顺序)

一、介绍

priority_queue是C++标准库中提供的一种容器适配器,它提供了一种存储和操作元素的方式,确保优先级最高的元素始终位于队列的前面。它可以在运行时自动地保持其元素有序。其内部实现了一个堆(heap),具有以下性质:

最大堆(max heap):根节点的值大于等于其子节点的值。
最小堆(min heap):根节点的值小于等于其子节点的值。

priority_queue中的元素根据它们的优先级进行排序,这是由在声明时提供的比较函数决定的。默认情况下,priority_queue使用std::less按升序排序元素,其中T是被存储元素的类型。

priority_queue容器支持以下操作:

push(): 将新元素插入到优先级队列中。
pop(): 从优先级队列中删除最高优先级的元素。
top(): 返回位于队列前面的最高优先级的元素。
empty(): 检查优先级队列是否为空。
size(): 返回优先级队列中元素的数量。
需要注意的是,priority_queue并不提供遍历容器中所有元素的方式,因为它被设计为只允许访问位于队列前面的最高优先级的元素。如果需要遍历所有元素,可以将priority_queue的元素复制到另一个容器中进行遍历。

参数说明:

std::priority_queue<T, Container, Compare>

其中,T 表示队列中元素的类型;Container 表示内部容器的类型,默认情况下是 std::vector;Compare 是一个可选的比较函数对象,用来指定元素的比较规则,如果不指定,则默认使用 std::less 来进行比较。

下面分别介绍 Container 和 Compare 两个参数。

Container
Container 是一个用于存储元素的内部容器类型,默认为 std::vector。它必须提供以下几个方法:

front():返回队列中第一个元素的引用。
push_back(const T& x):将元素 x 添加到容器的末尾。
pop_back():删除容器末尾的元素。
size():返回容器中元素的个数。
除了 std::vector,还可以使用其他类型的容器,例如 std::deque,或者用户自定义的容器类型。

Compare
Compare 是一个可选的比较函数对象,用来指定元素的比较规则。如果不指定,则默认使用 std::less 来进行比较,即使用 < 运算符来比较元素大小。如果想要创建一个最小堆,则可以指定 Compare 为 std::greater,即使用 > 运算符来比较元素大小。

比较函数对象需要实现一个接受两个元素的参数,返回一个 bool 类型的结果,表示第一个元素是否小于(或大于)第二个元素。例如:

struct Compare {
    bool operator()(const T& lhs, const T& rhs) {
        // 比较 lhs 和 rhs 的大小关系,返回结果
    }
};

当我们指定 Compare 为 struct Compare 时,我们需要自己实现比较函数 operator(),来定义元素的比较规则。

二、demo

#include <queue>
#include <iostream>

using namespace std;

int main() {
    priority_queue<int> max_heap;

    // Insert elements into the heap
    max_heap.push(10);
    max_heap.push(20);
    max_heap.push(15);

    // Print the largest element in the heap
    cout << "Largest element in the heap: " << max_heap.top() << endl;

    // Remove the largest element from the heap
    max_heap.pop();

    // Print the new largest element in the heap
    cout << "New largest element in the heap: " << max_heap.top() << endl;

    return 0;
}

输出结果:

Largest element in the heap: 20
New largest element in the heap: 15

三、自定义排序

#include <iostream>
#include <queue>
#include <string>
#include <vector>
#include <functional> 
using namespace std;
struct data_info
{
    string data;
    int line;
};

struct cmp1
{
	bool operator () (data_info a,data_info b)		  
	{
		return a.line < b.line; 	
	}
};

void test_priority_queue()
{

    priority_queue<data_info, vector<data_info>, cmp1> data_queue; 
    data_queue.push({"123", 0});
    data_queue.push({"852", 1});
    data_queue.push({"2341", 2});
    data_queue.push({"789", 1});
    data_queue.push({"1233", 0});
    data_queue.push({"963", 1});
    data_queue.push({"1232", 0});
    data_queue.push({"756", 1});
    data_queue.push({"2342", 2});
    data_queue.push({"1231", 0});
    data_queue.push({"234", 2});

    
    data_queue.push({"741", 2});

    while(!data_queue.empty())
    {
        cout << data_queue.top().data << " "  << data_queue.top().line<< endl;
        data_queue.pop();
    }
        

}
int main()
{
	test_priority_queue();
	return 0;
}

输出结果

2341 2
741 2
2342 2
234 2
852 1
963 1
789 1
756 1
1232 0
1233 0
1231 0
123 0

需要注意的是:如果priority_queue中有多个元素具有相同的优先级,它们的排列方式是不确定的。这是因为priority_queue使用堆数据结构来维护元素的优先级,堆的性质决定了同一优先级的元素之间没有明确的顺序。

在默认情况下,priority_queue使用std::less作为比较函数来比较元素的优先级,这将导致具有相同优先级的元素以相反的顺序排列,即后插入的元素将排在前面。如果需要更精确的控制元素之间的顺序,可以提供自定义比较函数来指定元素之间的优先级关系。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
6、 函数模板和类模板 3 6.1函数模板 4 6.1.1为什么要有函数模板 4 6.1.2函数模板语法 5 6.1.3函数模板和模板函数 6 6.1.4函数模板做函数参数 6 6.1.5函数模板遇上函数重载 8 6.1.6 C++编译器模板机制剖析 10 6.2类模板 18 6.2.1为什么需要类模板 18 6.2.2单个类模板语法 18 6.2.3继承中的类模板语法 20 6.2.4类模板语法知识体系梳理 21 6.2.5类模板中的static关键字 23 6.3类模板在项目开发中的应用 25 6.4作业 29 7、C++的类型转换 29 7.1 类型转换名称和语法 29 7.2 类型转换一般性介绍 29 7.3 典型案例 30 7.3.1 static_cast用法和reinterpret_cast用法 30 7.3.2 dynamic_cast用法和reinterpret_cast用法 31 7.3.3 const_cast用法 33 7.4 总结 33 8、异常处理机制专题 33 8.1 异常处理的基本思想 34 8.1.1传统错误处理机制 34 8.1.2异常处理的基本思想 34 8.2 C++异常处理的实现 35 8.2.1异常基本语法 35 8.2.2栈解旋(unwinding) 39 8.2.3异常接口声明 40 8.2.4异常类型和异常变量的生命周期 40 8.2.5异常的层次结构(继承在异常中的应用) 46 8.3标准程序库异常 47 8.4训练强化 51 9 C++输入和输出流 51 9.1 I/O流的概念和流类库的结构 51 9.2标准I/O流 53 9.2.1标准输入流 55 9.2.2标准输出流 59 9.3文件I/O 66 9.3.1文件流类和文件流对象 66 9.3.2C++文件的打开与关闭 67 9.3.3C++对ASCII文件的读写操作 69 9.3.4 C++对二进制文件的读写操作 74 9.4作业练习 75 10、STL实用技术专题 79 10.1 STL(标准模板库)理论基础 79 10.1.1基本概念 79 10.1.2容器 80 10.1.3迭代器 82 10.1.4算法 82 10.1.5C++标准库 82 10.1.6模板简要回顾 85 10.2容器 86 10.2.1 STL的string 86 10.2.2Vector容器 90 10.2.3Deque容器 96 10.2.4stack容器 101 10.2.5Queue容器 103 10.2.6List容器 105 10.2.7优先级队列priority_queue 110 10.2.8Set和multiset容器 111 10.2.9Map和multimap容器 118 10.2.10容器共性机制研究 123 10.2.11其他 124 10.3算法 125 10.3.1算法基础 125 10.3.2STL算法中函数对象和谓词 138 10.3.3常用的遍历算法 148 10.3.4常用的查找算法 152 10.3.5常用的排序算法 154 10.3.6常用的拷贝和替换算法 156 10.3.7常用的算术和生成算法 157 10.3.8常用的集合算法 158 10.4 STL综合案例 159 10.4.1案例学校演讲比赛 159 10.4.2案例:足球比赛 161

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值