首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C/C++ 標準庫:priority_queue 優先隊列使用詳解與自定義比較

     編輯:C++ 入門

std::priority_queue 是容器適配器,默認大頂堆(最大元素在 top)。適用於任務調度、異步處理等需按優先級處理的場景。

關鍵機制

  • 底層容器默認 vector,堆操作 push_heap/pop_heap
  • 比較函數 Compare:返回 true 表示 a 優先級 低於 b(即 a 在 b 之後)
  • 若需「優先級高者先出」,Compare 應返回 a.priority > b.priority

完整示例:任務優先級調度

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

class Task {
public:
    Task(int p) : priority_(p) {}
    int priority_;
    void DoWork() { cout << "DoWork: " << this << " priority: " << priority_ << endl; }
};

struct PriorityCompare {
    bool operator()(Task* a, Task* b) {
        return a->priority_ > b->priority_; // 數值小優先級高
    }
};

int main() {
    priority_queue, PriorityCompare> q;
    Task t1(1), t2(10), t3(3), t4(1), t5(8), t6(9);
    q.push(&t1); q.push(&t2); q.push(&t3);
    q.push(&t4); q.push(&t5); q.push(&t6);
    while (!q.empty()) {
        q.top()->DoWork();
        q.pop();
    }
    return 0;
}

輸出結果

DoWork: 0x... priority: 1
DoWork: 0x... priority: 1
DoWork: 0x... priority: 3
DoWork: 0x... priority: 8
DoWork: 0x... priority: 9
DoWork: 0x... priority: 10

注意事項

  1. 存儲指針時需確保對象生命週期覆蓋隊列使用期
  2. 自定義比較器可為仿函數、lambda(C++11)、函數指針
  3. 無 clear() 方法,需重新構造或循環 pop 清空

掌握 priority_queue 及其比較器邏輯,是高效實現優先級調度的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved