在优先队列中使用结构体的若干小结

以结构体Time为例:

struct Time{
    int start, end;
};


使用优先队列时,如果需要对Time中的start从小到大排序,有两种方法:

priority_queue<Time> pq;


一.在结构体外重载结构体小于运算符:
bool operator <(const Time& a,const Time& b){
    return a.start > b.start;
}  //这里以大于重载小于是因为默认情况下,优先队列是以大的作为队首,这样一反,就可以再默认情况下使得小的作为队首

二.直接在结构体中重载小于运算符:
struct Time{  
    int start, end;  
    bool operator < (const Time& t)const{  
        return start > t.start;  
    }  
};  

实质上来说是一样的。。。。

另外要注意的是:参数列表中的const不能省略,否则报错~~




### 使用结构体实现优先队列 在 C/C++ 中,可以通过自定义 `struct` 来实现优先队列的功能。以下是具体方法: #### 自定义比较函数 为了使优先队列能够按照特定规则排序,通常需要提供一个比较器类或者函数对象来控制顺序。通过将该比较逻辑嵌入到结构体中,可以灵活调整优先级。 ```cpp #include <queue> #include <vector> // 定义节点结构体 typedef struct Node { int value; double priority; // 构造函数初始化成员变量 Node(int v, double p) : value(v), priority(p) {} // 运算符重载用于比较两个Node实例之间的大小关系 (小顶堆) bool operator<(const Node& other) const { return this->priority > other.priority; // 小于号表示最小堆 } } NodeStruct; ``` 上述代码片段展示了如何创建一个简单的 `Node` 结构体,并为其提供了 `<` 的运算符重载功能以便支持标准库中的优先队列容器[^1]。 #### 创建基于结构体优先队列 一旦我们有了带有适当比较机制的结构体类型,则可以直接利用 STL 提供的标准模板类 `std::priority_queue` 实现优先队列。 ```cpp int main() { // 声明一个存储Node类型的优先队列,默认是最小堆 std::priority_queue<NodeStruct> pq; // 向优先队列插入一些元素 pq.push(NodeStruct(10, 2.5)); pq.push(NodeStruct(20, 1.8)); pq.push(NodeStruct(30, 3.7)); while (!pq.empty()) { NodeStruct topElement = pq.top(); printf("Value=%d Priority=%.1f\n", topElement.value, topElement.priority); pq.pop(); // 移除当前最高优先级项 } return 0; } ``` 此程序段演示了怎样构建并操作由用户定义的数据类型组成的优先队列[^2]。注意这里采用了默认的小根堆形式;如果希望得到最大值最先弹出的大根堆效果,则需修改比较条件或将第二个参数显式指定为降序排列方式[^3]。 ### 性能考量 当采用不同底层数据结构时,其时间复杂度会有所差异: - **数组**:对于基本场景下的简单应用来说已经足够好用了,不过它可能带来较高的查找成本 O(n)[^2]. - **平衡二叉树** 如红黑树等则能在维持较好的平均性能的同时保持较低的最大延迟 O(log n). 综上所述,在实际开发过程中应根据具体情况选择合适的方案以满足需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值