【问题标题】:Modifying top of priority queue of custom objects修改自定义对象的优先级队列顶部
【发布时间】:2021-08-17 20:23:10
【问题描述】:

假设我有一个自定义结构

struct custom
{
  int quantity;
  double price;
}

以及自定义对象的优先级队列:

std::priority_queue<custom, std::vector<custom>, some_custom_comparer_t> pq{...}

some_custom_comparer_t 只会根据价格而非数量对custom 进行排序。有什么办法可以让我更改custom 顶部priority queue 对象的quantity

我知道我无法更改价格,因为 STL 容器不允许调整优先级队列的键,但在这种情况下,我希望代码能够识别 quantity 变量不是密钥,请允许我修改它。

到目前为止,我的解决方案是把它弹出,调整数量,然后把它推回去。

【问题讨论】:

标签: c++ priority-queue


【解决方案1】:

制作数量mutable。一个类的可变成员可以被修改,即使是在const类实例的上下文中。

struct custom
{
  mutable int quantity;
  double price;
};

到目前为止,我的解决方案是弹出它,调整数量,然后将其推回。

现在你可以这样做了:

sq.top().quantity = new_quantity;

【讨论】:

  • 哦。我实际上并不认为它们会起作用。我认为我必须对内部 priority_queue 结构本身进行一些修改。如果我想修改价格怎么办?这个想法如何告诉 STL 容器它可能需要对修改后的项目进行堆积?
  • @user5965026 如果priority_queue 是由price 订购的,则更改price 的风险自负。 priority_queue 不会知道你做了,也不会重新排列队列的内容。在这种情况下,您必须删除、更改和重新插入新的price 才能得到尊重。请注意,更改排序键可能是未定义的行为,因此该程序可能会做一些非常奇怪的事情,例如为您注册月度图书俱乐部。
  • 还有,const_cast
猜你喜欢
  • 2012-03-03
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多