c++ - STL 优先队列 : When/How Does Resorting Occur?

标签 c++ stl priority-queue

如果我有一个结构的 STL priority_queue,其中优先级基于结构的某些属性,并且我更改了其中一个结构的属性,这样新的顺序就会不同,那么优先级队列会知道求助于本身?还是我必须将其从队列中删除并再次插入?我在某处读到,排序是在调用 push() 和 pop() 时完成的,但我想确认一下。

最佳答案

priority_queue push()pop() 成员函数是根据 push_heap() 的行为定义的pop_heap() 库函数,其中底层容器的全部内容作为范围传入。

这些函数要求范围(push_heap() 中容器中的最后一项除外,因为这是要添加的项目)“应该是一个有效的堆”。如果您修改包含的元素,使容器不再是有效的堆,那么您将得到未定义的行为。

因此,如果您需要以这种方式修改一个元素,您需要先删除它,修改它,然后再将它添加回去。或者,您可以弄乱内容,然后调用 make_heap() 来重建堆。

参见 C++11 23.6.4.3“priority_queue 成员”、25.4.6.1“push_heap”和 25.4.6.2“pop_heap”。

关于c++ - STL 优先队列 : When/How Does Resorting Occur?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197738/

相关文章:

c++ - 从类返回指针。谁负责删除?

c++ - NS-3 自载网络 : How to implement simple intersection scenario?

c++ - 两个进程之间如何通信

c++ - 在 map 中包含 map 的结构? (C++/STL)

java - 比较器声明语法

c++ - 之前预期的主要表达。调用类函数时

c++ - boost::filesystem::path::append(通过迭代器)导致编译器错误

c++ - 具有不同模板参数的模板对象的集合

python - python 中的 heapq 模块可以使用哪些类型的堆元素?

c++ - C++中 "bounded priority queue"的自由实现