簡體   English   中英

當我在優先級隊列中使用自定義構造函數時,為什么 C++ 返回錯誤?

[英]Why C++ returns error when I use my custom constructor in priority queue?

priority_queue<pair<int, int>, vector<pair<int, int>>, comparator> pq;

static bool comparator(pair<int, int> &m, pair<int, int> &n) {
    if (m.second < n.second) return true;
    else return false;
}

錯誤: 錯誤圖片

我在 class 中定義了我的比較器,並嘗試在同一個 class 中的另一個 function 中聲明優先級隊列,然后發生錯誤。

模板類型參數的第三個模板參數必須是類型,而comparator是 function。 您可以使用decltype(&comparator)獲得 function 的類型。

std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, decltype(&comparator)> pq;

std::priority_queue的第三個模板參數是一個類型。

comparator不是一種類型。 它是 function。

但在您解決此問題之前,還有兩個問題需要解決:

  1. types 和 object 必須在使用之前聲明,並且顯示的代碼在使用之前沒有聲明comparator

  2. 比較器必須將其參數作為const引用,不允許修改它們。

因此,您的比較器應該是:

static bool comparator(const pair<int, int> &m, const pair<int, int> &n)

它的類型是: bool (*)(const pair<int, int> &, const pair<int, int> &)

這就是std::priority_queue模板的第三個參數應該是什么,然后必須將實際的比較器傳遞給對象的構造函數, std::priority_queue有一個重載的構造函數,它將比較器的實例作為參數:

static bool comparator(const pair<int, int> &m, const pair<int, int> &n) {
    if (m.second < n.second) return true;
    else return false;
}

priority_queue<pair<int, int>, vector<pair<int, int>>,
           bool (*)(const pair<int, int> &, const pair<int, int> &)
           > pq{comparator};

但是,您會發現其中大部分是不必要的,我展示它只是出於迂腐的目的。 std::priority_queue的默認比較器模板參數可以正常工作,因為std::pair實現了operator<

priority_queue<pair<int, int>, vector<pair<int, int>>> pq{comparator};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM