2016-04-25 118 views
2

我想實現一個優先級隊列,每當我推入一個新項目或從隊列中彈出一個項目時,就會執行一個函數,例如添加或減去每個項目「錯誤「到全局」錯誤「。擴展std :: priority_queue的功能

是否有一些整潔的標準的方式來實現這一目標?下面是一個簡單的例子,我已經解決了它有一個「包裝」std :: priority_queue的結構。我是一個新手C++程序員,因此我不確定這是否是最有效的解決方案。

#include <queue> 

struct myStruct { 
    double Error; 
    friend bool operator<(const myStruct& lhs, const myStruct& rhs) 
    { 
     return lhs.Error < rhs.Error; 
    } 
}; 

typedef std::priority_queue < myStruct, std::vector<myStruct>, std::less<myStruct>> StdQueue; 

struct priorityQueue { 
    priorityQueue() { Error = 0; } 
    StdQueue queue; 
    double Error; 

    void push(myStruct s) 
    { 
     Error += s.Error; 
     queue.push(s); 
    } 

    void pop() 
    { 
     Error -= queue.top().Error; 
     queue.pop(); 
    } 
}; 

在此先感謝!

+1

這應該被髮布到[codereview.se]。 –

+0

@BartekBanachewicz CR.SE需要一個完整的工作示例。我認爲這個問題是可以的。 – NathanOliver

回答

3

與實際容器不同,container adaptors實際上設計爲可繼承。例如,如果你看看例如this std::priority_queue reference你會看到它有protected member objects

這意味着您可以繼承std::priority_queue並創建您自己的poppush函數,以在調用實際隊列函數之前執行所需操作。

正如skypack在註釋中指出的那樣,函數不是virtual,這意味着您不能對繼承的類使用多態。你不能真的把它傳遞給期望std::priority_queue的函數,代碼必須明確地使用你的類。

+0

即使適配器將成員公開給派生類,'pop'和'push'也不會被聲明爲'virtual'。如果想從'std :: priority_queue'繼承,這是需要注意的地方。多態性不是免費的。 – skypjack