我想以这样一种方式实现优先级队列,即每次我推送一个新项目或从队列中弹出一个项目时,都会执行一个函数,例如将每个项目“错误”添加或减去全局“错误” ".
是否有一些巧妙的标准方法来实现这一目标?下面是一个简化的例子,我已经解决了它有一个“包装”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
继承并创建您自己的 pop
和 push
函数,以便在调用实际的队列功能。
正如 skypack 在评论中指出的那样,函数不是 virtual
,这意味着您不能对继承的类使用多态性。您不能真正将它传递给需要 std::priority_queue
的函数,代码必须明确使用您的类。
关于c++ - 扩展 std::priority_queue 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840368/