c++ - 扩展 std::priority_queue 功能

标签 c++ stl

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

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

提前致谢!

最佳答案

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

这意味着您可以从 std::priority_queue 继承并创建您自己的 poppush 函数,以便在调用实际的队列功能。

正如 skypack 在评论中指出的那样,函数不是 virtual,这意味着您不能对继承的类使用多态性。您不能真正将它传递给需要 std::priority_queue 的函数,代码必须明确使用您的类。

关于c++ - 扩展 std::priority_queue 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840368/

相关文章:

c++ - 是什么导致数组越界运行时错误?

c++ - std::copy 是否处理重叠范围?

c++ - Qt在linux上打印坐标错误

c++ - remove_if and then erase 在 vector 上是否有效?

c++ - 元组中返回的对象的 std::tie 和生命周期

c++ - boost::managed_shared_memory 可以正确处理 vector 吗?

c++ - 向实例添加数据的最有效方式

c++ - 从类成员生成容器

c++ - 替换字符串时出现编译错误

c++ - 类成员函数的 decltype