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::set
是 const
.
相反,您可以做的是构造 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/