stl中的优先队列

 

STL中优先队列的使用,关键是提供恰当的比较方式供队列内部使用。对于默认类型,比较符的选择确定了该优先队列是最大还是最小优先队列,对于自定义的结构体,如果比较方式没有选择好,会出现编译通过,但在第二次插入时出现运行时错误的问题。

 

头文件 <queue>

template <

   class Type,

   class Container=vector<Type>,

      class Compare=less<typename Container::value_type>

> 

class priority_queue

 

 

Type

The element data type to be stored in the priority_queue.

Container

The type of the underlying container used to implement the priority_queue.

Compare

The type that provides a function object that can compare two element values as sort keys to determine their relative order in the priority_queue. This argument is optional and the binary predicate less<typename Container::value_type> is the default value.

第二个参数我通常就用的vector<Type>,我其实也不太懂。

第三个参数其实是指明内部比较所使用的符号。当是最大优先队列的时候,用less<typename Container::value_type>(即用符号<作比较),当是最小优先队列的时候,用greater<typename Container::value_type>(即用符号>作比较)。

对于自定义的结构体,需要自己来写比较方法。有两种,一是重载操作符,二是比较类。

 

重载操作符

 

 

比较类

 


 

 

### C++ STL `priority_queue` 使用示例 C++标准模板库(STL)中的`priority_queue`是一个非常有用的容器适配器,它提供了堆的功能。默认情况下,`priority_queue`基于最大堆实现,即每次访问或删除的都是当前集合的最大元素。 #### 基本定义与初始化 可以使用不同的底层容器来创建`priority_queue`,最常用的底层容器是`std::vector`[^2]: ```cpp #include <queue> #include <iostream> // 定义一个整数类型的优先队列默认为最大堆 std::priority_queue<int> maxHeap; // 如果想要最小堆,则需自定义比较函数对象 struct MinCompare { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; std::priority_queue<int, std::vector<int>, MinCompare> minHeap; ``` #### 插入元素 通过调用成员函数`push()`向`priority_queue`中添加新元素: ```cpp maxHeap.push(10); minHeap.push(-5); while (!maxHeap.empty()) { // 输出直到为空 std::cout << "Max Heap Top Element: " << maxHeap.top() << '\n'; maxHeap.pop(); } ``` #### 访问顶部元素 可以通过成员函数`top()`获取最高优先级(最大值/最小值取决于构造方式)而不移除该元素;要真正取出并移除此元素则应随后调用`pop()`操作. ```cpp if (!minHeap.empty()){ std::cout << "Min Heap Top Element Before Pop: " << minHeap.top() << "\n"; } minHeap.pop(); if(!minHeap.empty()){ std::cout << "Min Heap Top Element After Pop: " << minHeap.top() << "\n"; } else{ std::cout << "Min heap is now empty.\n"; } ``` #### 自定义数据结构作为元素 当处理复杂的数据类型时,可能需要指定如何比较两个元素之间的大小关系。这通常涉及到重载小于运算符 `<` 或者提供第三个参数给`priority_queue`模板实例化过程以定制化的比较逻辑。 ```cpp class Task { public: int id; double priority; Task(int i, double p):id(i), priority(p){ } friend bool operator<(const Task &t1, const Task &t2){ return t1.priority < t2.priority; // 高优先级先出栈 } }; std::priority_queue<Task> taskQueue; taskQueue.emplace(Task{1, 98.7}); taskQueue.emplace(Task{2, 65.4}); Task top_task = taskQueue.top(); std::cout << "Top Task ID:" << top_task.id << ", Priority:" << top_task.priority << "\n"; taskQueue.pop(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值