欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入了解C++優(yōu)先隊列(priority_queue)的使用方法

 更新時間:2023年05月02日 10:29:47   作者:碼出世界的淡水魚  
在計算機科學中,優(yōu)先隊列是一種抽象數據類型,它與隊列相似,但是每個元素都有一個相關的優(yōu)先級。C++中的優(yōu)先隊列是一個容器適配器(container adapter),它提供了一種在元素之間維護優(yōu)先級的方法。本文帶你深入了解C++優(yōu)先隊列的使用方法,需要的可以參考下

優(yōu)先隊列的基本概念

在計算機科學中,優(yōu)先隊列是一種抽象數據類型,它與隊列相似,但是每個元素都有一個相關的優(yōu)先級。在優(yōu)先隊列中,當我們執(zhí)行插入操作時,我們將元素插入到隊列中,并根據其優(yōu)先級對其進行排序。在刪除操作中,我們會刪除優(yōu)先級最高的元素,并把隊列進行重新排序。優(yōu)先隊列通常使用堆來實現。

C++中的優(yōu)先隊列是一個容器適配器(container adapter),它提供了一種在元素之間維護優(yōu)先級的方法。使用C++優(yōu)先隊列,你可以在隊列頭部添加新元素,并從隊列頭部移除元素。當添加元素時,它將根據元素的排序準則將其放置在適當的位置。

優(yōu)先隊列的使用方法

在C++中,我們可以使用頭文件"queue"中的priority_queue來創(chuàng)建一個優(yōu)先隊列。接下來是一個簡單的代碼示例,它說明了如何使用priority_queue創(chuàng)建一個整數類型的隊列。

#include <iostream>
#include <queue>

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

    pq.push(1);
    pq.push(2);
    pq.push(3);
    
    std::cout << "Queue Size : " << pq.size() << std::endl;
    std::cout << "Top Element: " << pq.top() << std::endl;

    while(!pq.empty()) {
        std::cout << pq.top() << std::endl;
        pq.pop();
    }
    return 0;
}

在上面的代碼中,我們首先包含頭文件"queue",并使用std::priority_queue來創(chuàng)建一個整數類型的優(yōu)先隊列。接下來,我們使用push()方法向隊列中添加元素。在添加元素后,我們可以使用size()方法來檢查隊列的大小。我們還可以使用top()方法獲取隊列的頂部元素。

在while循環(huán)中,我們使用top()方法檢查頂部元素,并使用pop()方法從隊列中刪除它。

優(yōu)先隊列元素的排序規(guī)則

默認情況下,C++優(yōu)先隊列使用std::less來確定哪個元素具有更高的優(yōu)先級。這意味著優(yōu)先隊列中的元素以升序排列。如果您想使用降序排列,您可以將std::greater用作參數。

接下來是一個降序排列的示例:

#include <iostream>
#include <queue>

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

    pq.push(3);
    pq.push(2);
    pq.push(1);
    
    std::cout << "Queue Size : " << pq.size() << std::endl;
    std::cout << "Top Element: " << pq.top() << std::endl;

    while(!pq.empty()) {
        std::cout << pq.top() << std::endl;
        pq.pop();
    }
    return 0;
}

在上述代碼中,我們向priority_queue的構造函數中添加了第三個參數std::greater。這表示我們正在使用降序排列。

元素的自定義排序

有時,您可能需要使用自定義排序規(guī)則將元素插入到C++優(yōu)先隊列中。在這種情況下,您可以使用lambda表達式或者實現一個二元謂詞(類似于比較函數)。

接下來是一個使用lambda表達式進行排序的示例:

#include <iostream>
#include <queue>

struct custom_struct {
    int priority;
    std::string message;

    custom_struct(int priority_, std::string message_) : priority(priority_), message(message_) {}
};

int main() {
    auto comp = [](custom_struct a, custom_struct b) {return a.priority > b.priority;};
    std::priority_queue<custom_struct, std::vector<custom_struct>, decltype(comp)> pq(comp);

    pq.push(custom_struct(1, "Hello"));
    pq.push(custom_struct(2, "World"));
    pq.push(custom_struct(3, "Priority"));
    
    std::cout << "Queue Size : " << pq.size() << std::endl;
    std::cout << "Top Element: " << pq.top().message << std::endl;

    while(!pq.empty()) {
        std::cout << pq.top().message << std::endl;
        pq.pop();
    }
    return 0;
}

在上述代碼中,我們首先定義一個名為custom_struct的自定義結構體。接下來,我們使用lambda表達式定義了一個比較二元謂詞。第三個參數是我們自定義的二元謂詞。最后,我們創(chuàng)建了一個custom_struct類型的優(yōu)先隊列,并在其構造函數中使用comp參數,這將使用我們剛剛定義的比較謂詞對元素進行排序。

優(yōu)先隊列的時間復雜度

C++優(yōu)先隊列是使用堆來實現的。插入和刪除元素的時間復雜度為O(log(n)),其中n是隊列中的元素數。獲取隊列頂部元素的時間復雜度為O(1)。由于我們使用的是標準容器庫,所以這些時間復雜度是可以保證的。

總結

C++優(yōu)先隊列是一種非常有用的數據結構,它允許我們以有序的方式存儲和訪問元素。無論是從插入元素的角度還是從獲取頂端元素的角度來看,使用C++優(yōu)先隊列都比自己手動實現堆或者排序數組更加快速和便捷。掌握C++優(yōu)先隊列可以讓您更輕松地完成許多常見的編程任務,并且可以提高您的編碼效率和代碼質量。

到此這篇關于深入了解C++優(yōu)先隊列(priority_queue)的使用方法的文章就介紹到這了,更多相關C++ 優(yōu)先隊列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 中

    C++ 中"emplace_back" 與 "push_back" 的區(qū)別

    這篇文章主要介紹了C++ 中"emplace_back" 與 "push_back" 的區(qū)別的相關資料,需要的朋友可以參考下
    2017-04-04
  • 在c和c++中實現函數回調

    在c和c++中實現函數回調

    如何在c和c++中實現函數回調呢?現在小編就和大家分享一下在c/c++中實現函數回調的示例代碼,需要的朋友可以參考下
    2013-07-07
  • C++算法之海量數據處理方法的總結分析

    C++算法之海量數據處理方法的總結分析

    本篇文章是對海量數據處理方法進行了詳細的總結與分析,需要的朋友參考下
    2013-05-05
  • C語言實現的循環(huán)單鏈表功能示例

    C語言實現的循環(huán)單鏈表功能示例

    這篇文章主要介紹了C語言實現的循環(huán)單鏈表功能,結合實例形式分析了基于C語言實現的循環(huán)單鏈表定義、創(chuàng)建、添加、刪除、打印、排序等相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • C++中返回指向函數的指針示例

    C++中返回指向函數的指針示例

    int (*ff(int)) (int *,int);表示:ff(int)是一個函數,帶有一個int型的形參,該函數返回int (*) (int *,int),它是一個指向函數的指針,所指向的函數返回int型并帶有兩個分別是Int*和int型的形參
    2013-09-09
  • C++如何實現簡單的計時器詳解

    C++如何實現簡單的計時器詳解

    因為最近閑著無聊就想著要不用C++寫點什么東西,仔細想了想其實自己的C++學的也不怎么好,寫個簡單的計時器吧!所以下面這篇文章主要介紹了利用C++如何實現簡單的計時器,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Qt透明無邊框窗口的實現示例

    Qt透明無邊框窗口的實現示例

    這篇文章主要介紹了Qt透明無邊框窗口的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 簡單談談C++ 中指針與引用

    簡單談談C++ 中指針與引用

    下面用通俗易懂的話來概述一下,指針-對于一個類型T,T*就是指向T的指針類型,也即一個T*類型的變量能夠保存一個T對象的地址,而類型T是可以加一些限定詞的,引用-引用是一個對象的別名,主要用于函數參數和返回值類型,符號X&表示X類型的引用。
    2015-09-09
  • C語言指針的圖文詳解

    C語言指針的圖文詳解

    這篇文章主要為大家介紹了C語言指針,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言實現直角坐標轉換為極坐標的方法

    C語言實現直角坐標轉換為極坐標的方法

    這篇文章主要介紹了C語言實現直角坐標轉換為極坐標的方法,涉及C語言進行三角函數與數值運算相關操作技巧,需要的朋友可以參考下
    2017-09-09

最新評論