最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中std::priority_queue的使用小結(jié)

 更新時間:2025年04月07日 08:37:03   作者:點云SLAM  
std::priority_queue是C++ STL提供的優(yōu)先隊列,本文主要介紹了C++中std::priority_queue的使用小結(jié),具有一定的參考價值,感興趣的可以了解一下

std::priority_queue 是 C++ STL 提供的 優(yōu)先隊列,它是一種 最大堆(默認情況下),可以用于高效地獲取當前最大(或最小)的元素。

1. 基本用法

(1) 頭文件

要使用 std::priority_queue,需要包含:

#include <queue>
#include <vector>
#include <iostream>

(2) 默認情況(最大堆)

默認情況下,std::priority_queue 是 最大堆,即 堆頂是最大元素:

std::priority_queue<int> pq;  // 默認是最大堆

示例:

#include <iostream>
#include <queue>

int main() {
    std::priority_queue<int> pq;

    pq.push(10);
    pq.push(30);
    pq.push(20);

    std::cout << "堆頂元素:" << pq.top() << std::endl;  // 輸出 30

    pq.pop();  // 移除 30
    std::cout << "新的堆頂:" << pq.top() << std::endl;  // 輸出 20

    return 0;
}

? 特點

  • push() 插入元素,自動維護最大堆。
  • top() 獲取當前最大元素(堆頂)。
  • pop() 移除堆頂元素(但不返回它)。
  • size() 獲取隊列大小。
  • empty() 檢查隊列是否為空。

2. 自定義最小堆

如果要實現(xiàn) 最小堆(堆頂是最小元素),可以用 std::greater<T>

std::priority_queue<int, std::vector<int>, std::greater<int>> pq_min;

示例:

#include <iostream>
#include <queue>

int main() {
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq_min;

    pq_min.push(10);
    pq_min.push(30);
    pq_min.push(20);

    std::cout << "堆頂元素:" << pq_min.top() << std::endl;  // 輸出 10

    pq_min.pop();
    std::cout << "新的堆頂:" << pq_min.top() << std::endl;  // 輸出 20

    return 0;
}

? 重點

  • std::greater<int> 使 priority_queue 變成 最小堆。

3. 自定義比較函數(shù)(結(jié)構(gòu)體/仿函數(shù))

(1) 結(jié)構(gòu)體仿函數(shù)

struct Compare {
    bool operator()(int a, int b) {
        return a > b;  // 最小堆(a > b 表示 a 在 b 下面)
    }
};
std::priority_queue<int, std::vector<int>, Compare> pq;

示例:

#include <iostream>
#include <queue>

struct Compare {
    bool operator()(int a, int b) {
        return a > b;  // 讓小的元素優(yōu)先級高
    }
};

int main() {
    std::priority_queue<int, std::vector<int>, Compare> pq;

    pq.push(10);
    pq.push(30);
    pq.push(20);

    std::cout << "堆頂元素:" << pq.top() << std::endl;  // 輸出 10

    pq.pop();
    std::cout << "新的堆頂:" << pq.top() << std::endl;  // 輸出 20

    return 0;
}

? 優(yōu)點

  • 適用于復雜的數(shù)據(jù)結(jié)構(gòu)(如 struct)。
  • 允許靈活定義優(yōu)先級。

4. 處理結(jié)構(gòu)體類型

如果 priority_queue 存儲的是 自定義結(jié)構(gòu)體,需要提供比較規(guī)則。

(1) 按權(quán)重排序的任務調(diào)度

#include <iostream>
#include <queue>

struct Task {
    int id;
    int priority;

    // 重載運算符,用于最大堆(優(yōu)先級大的優(yōu)先)
    bool operator<(const Task& other) const {
        return priority < other.priority;  // 優(yōu)先級高的排前面
    }
};

int main() {
    std::priority_queue<Task> pq;

    pq.push({1, 3});
    pq.push({2, 5});
    pq.push({3, 1});

    std::cout << "最高優(yōu)先級任務 ID:" << pq.top().id << std::endl;  // 輸出 2

    pq.pop();
    std::cout << "新的最高優(yōu)先級任務 ID:" << pq.top().id << std::endl;  // 輸出 1

    return 0;
}

? 特點

  • 默認是最大堆,因此 operator< 定義為 優(yōu)先級小的在下面。

(2) 使用自定義比較函數(shù)

如果不能修改 struct,可以使用 外部比較函數(shù):

struct CompareTask {
    bool operator()(const Task& a, const Task& b) {
        return a.priority > b.priority;  // 最小堆
    }
};

std::priority_queue<Task, std::vector<Task>, CompareTask> pq;

完整示例:

#include <iostream>
#include <queue>

struct Task {
    int id;
    int priority;
};

// 使 priority_queue 變成最小堆
struct CompareTask {
    bool operator()(const Task& a, const Task& b) {
        return a.priority > b.priority;  // 小優(yōu)先級的任務優(yōu)先
    }
};

int main() {
    std::priority_queue<Task, std::vector<Task>, CompareTask> pq;

    pq.push({1, 3});
    pq.push({2, 5});
    pq.push({3, 1});

    std::cout << "最高優(yōu)先級任務 ID:" << pq.top().id << std::endl;  // 輸出 3

    pq.pop();
    std::cout << "新的最高優(yōu)先級任務 ID:" << pq.top().id << std::endl;  // 輸出 1

    return 0;
}

? 適用場景

  • 優(yōu)先隊列調(diào)度算法
  • 事件驅(qū)動仿真
  • A 搜索(最短路徑算法)*

5. priority_queue 適用場景

應用場景用法
最大堆(默認)std::priority_queue<int>
最小堆std::priority_queue<int, std::vector<int>, std::greater<int>>
存儲結(jié)構(gòu)體(最大堆)結(jié)構(gòu)體重載 <
存儲結(jié)構(gòu)體(最小堆)std::greater<> 或自定義 Compare
K 大/小元素維護大小為 K 的堆
Dijkstra / A 搜索*結(jié)合 std::pair<int, int> 進行路徑計算

6. 經(jīng)典應用示例

(1) 找到前 K 個最大元素

#include <iostream>
#include <queue>
#include <vector>

void findTopK(std::vector<int>& nums, int k) {
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq; // 最小堆

    for (int num : nums) {
        pq.push(num);
        if (pq.size() > k) pq.pop();  // 只保留 k 個最大值
    }

    std::cout << "前 " << k << " 個最大元素:" << pq.top() << std::endl;
}

int main() {
    std::vector<int> nums = {3, 1, 5, 12, 2, 11};
    findTopK(nums, 3);  // 輸出 5
}

? 復雜度:O(N log K)

總結(jié)

  • std::priority_queue 默認是 最大堆,可以用 std::greater<> 實現(xiàn) 最小堆。
  • 存儲結(jié)構(gòu)體時,可以使用 重載 < 運算符 或 自定義比較器。
  • 適用于 任務調(diào)度、路徑搜索(Dijkstra/A)等場景*。

到此這篇關(guān)于C++中std::priority_queue的使用小結(jié)的文章就介紹到這了,更多相關(guān)C++ std::priority_queue的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • VC++實現(xiàn)View內(nèi)容保存為圖片的方法

    VC++實現(xiàn)View內(nèi)容保存為圖片的方法

    這篇文章主要介紹了VC++實現(xiàn)View內(nèi)容保存為圖片的方法,涉及VC++中Bitmap類的save方法相關(guān)使用技巧,需要的朋友可以參考下
    2016-08-08
  • C++特性之智能指針shared_ptr詳解

    C++特性之智能指針shared_ptr詳解

    shared_ptr是C++11提供的一種智能指針類,它足夠智能,可以在任何地方都不使用時自動刪除相關(guān)指針,從而幫助徹底消除內(nèi)存泄漏和懸空指針的問題。本文主要是來和大家聊聊shared_ptr的使用,需要的可以參考一下
    2022-12-12
  • c++中for雙循環(huán)的那些事

    c++中for雙循環(huán)的那些事

    本人很菜,今天看《C++編程思想》中的一道課后題中說到這樣一個問題。修改兩層嵌套的for循環(huán)的標識符,觀察結(jié)果變化
    2013-05-05
  • C語言 數(shù)組指針詳解及示例代碼

    C語言 數(shù)組指針詳解及示例代碼

    本文主要介紹C語言 數(shù)組指針,這里整理了相關(guān)資料并附示例待會及實現(xiàn)結(jié)果,幫助大家學習C語言中指針的知識,有需要學習此部分內(nèi)容的朋友可以參考下
    2016-08-08
  • 利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解

    利用ace的ACE_Task等類實現(xiàn)線程池的方法詳解

    本篇文章是對利用ace的ACE_Task等類實現(xiàn)線程池的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一文讓你不再害怕指針之C指針詳解(經(jīng)典,非常詳細)

    一文讓你不再害怕指針之C指針詳解(經(jīng)典,非常詳細)

    這篇文章主要給大家介紹了C指針的相關(guān)資料,文中介紹的很經(jīng)典,非常詳細,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C指針具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • C++實現(xiàn)電子時鐘效果

    C++實現(xiàn)電子時鐘效果

    這篇文章主要為大家詳細介紹了C++實現(xiàn)電子時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 獲取當前系統(tǒng)本地時間,精確到毫秒的實例

    獲取當前系統(tǒng)本地時間,精確到毫秒的實例

    下面小編就為大家?guī)硪黄@取當前系統(tǒng)本地時間,精確到毫秒的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • VC++ 字符串String MD5計算小工具 VS2008工程

    VC++ 字符串String MD5計算小工具 VS2008工程

    基于字符串加密的MD5算法,VS2008 VC++,多字節(jié)編譯工程。主要代碼如下,實現(xiàn)了ANSI字符串加密與Unicode字符串加密,需要的朋友可以參考下
    2017-07-07
  • C++設(shè)計模式中的工廠模式詳細介紹

    C++設(shè)計模式中的工廠模式詳細介紹

    工廠模式,是一種實例化對象的方式,只要輸入需要實例化對象的名字,就可以通過工廠對象的相應工廠函數(shù)來制造你需要的對象
    2022-09-09

最新評論

宁蒗| 潜山县| 梓潼县| 司法| 济阳县| 松原市| 会泽县| 镇远县| 宝山区| 泗水县| 永定县| 常宁市| 霍山县| 广宁县| 衢州市| 乌恰县| 京山县| 三穗县| 德昌县| 庆元县| 梁平县| 工布江达县| 张家界市| 行唐县| 永州市| 察雅县| 秦安县| 榆树市| 蚌埠市| 本溪| 广平县| 红桥区| 信宜市| 驻马店市| 大厂| 西林县| 延吉市| 乌拉特中旗| 黔东| 嘉善县| 忻州市|