c++ - 如何使用用户定义的对象从priority_queue 获取非常量顶部元素?

标签 c++ c++11 constants priority-queue

std::priority_queue::top 返回一个常量值。但是,我想从优先级队列中删除顶部元素,并能够在其他地方对其进行修改。

priority_queue<SomeClass, vector<SomeClass>, SomeClassCompare > pQueue;
...
SomeClass *toBeModified = &(pQueue.top());
pQueue.pop();
toBeModified->setMember(3); // I would like to do this

有没有办法可以从优先级队列中获取顶部元素(并从队列中删除)并根据需要修改它?

最佳答案

标准容器和容器适配器具有值语义。当您将元素插入队列时,会创建一个拷贝。当您从队列中移除一个对象时,该对象将被销毁。

即使 top()将返回对非 const 的引用,一旦您从队列中删除元素,该引用就会变得悬空,并且取消引用它会导致未定义的行为。

这就是说,std::priority_queue返回对 const 的引用为了防止您(有意或无意地)弄乱其内部顺序 - 这与关联容器的键(例如 std::map)的原因几乎相同。和 std::setconst .

相反,您可以做的是构造 top() 返回的值的拷贝。 ,修改该拷贝,删除原件,并将拷贝插入队列:

SomeClass obj = pQueue.top();
pQueue.pop();
obj.setMember(42);
pQueue.push(std::move(obj)); // You can move obj into the queue if you no more need it

另一方面,如果您需要引用语义,那么您必须将指针插入队列(可能是智能指针,取决于您的用例)并提供适当的自定义排序标准,该标准将根据对象的属性对这些指针进行排序他们指向。

在这种情况下,请注意不要在运行时修改这些属性,以免它们的顺序不同。这将被视为“扰乱了容器的内部顺序”,并将导致未定义的行为。

关于c++ - 如何使用用户定义的对象从priority_queue 获取非常量顶部元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16754745/

相关文章:

c++ - 返回对此的右值引用的正确方法

java - 在 Java 中不进行强制转换来表示数字

javascript - 为什么常数字段不 protected ?

c++ - 通过 MSADO 获取查询以在 Access 中工作

c++ - 为什么基准测试 mod 运算符 (%) 经常显示 0 时间,即使是 5,000 轮?

c++ - 谈判无效

C++11 实现移动构造函数并移动成员 vector

c++ - 我怎样才能将 std::map 的迭代器递减一定数量?

c++ - Lambda 函数捕获变量与返回值?

c++ - 将指针数组作为 const 传递