【问题标题】:Extending the std::priority_queue functionality扩展 std::priority_queue 功能
【发布时间】:2016-04-25 12:18:38
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 这应该发布到Code Review
  • @BartekBanachewicz CR.SE 需要一个完整的工作示例。我认为这个问题在 SO 上是可以的。

标签: c++ stl


【解决方案1】:

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

这意味着您可以从 std::priority_queue 继承并创建自己的 poppush 函数来执行您想要的操作,然后再调用实际的队列函数。

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

【讨论】:

  • 即使适配器将成员暴露给派生类,poppush 也不会被声明为 virtual。如果想要从std::priority_queue 继承,这是需要注意的。多态性不是免费的。
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2011-10-10
  • 2020-02-14
  • 2018-02-12
  • 1970-01-01
相关资源
最近更新 更多