扩展std :: priority_queue功能

时间:2016-04-25 12:18:39

标签: c++ stl

我想以这样一种方式实现优先级队列:每次我从队列中推送一个新项目或弹出一个项目时都会执行一个函数,例如将每个项目“error”添加或减去全局“错误” ”

是否有一些简洁的标准方法来实现这一目标?下面是一个简化的例子,我已经解决了它有一个“包装”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 个答案:

答案 0 :(得分:3)

与实际容器不同,container adaptors实际上是为了可继承而设计的。例如,如果你看一下,例如this std::priority_queue reference您会看到它有protected member objects

这意味着您可以继承std::priority_queue并创建自己的poppush函数,以便在调用实际队列函数之前执行您想要的操作。

正如注释中的skypack所指出的,函数不是virtual,这意味着你不能对继承的类使用多态。您无法将其传递给期望std::priority_queue的函数,代码必须明确使用您的类。