更改运行时优先级队列的排序功能



我有一个带有自定义排序功能的std::priority_queue。在程序的某个时刻,我想使用不同的函数重新组织队列。

这可能吗?或者我可以创建一个指向队列的指针,以便在需要时指向不同排序的队列?

这是不可能的,因为提供给priority_queueCompare函数是模板类型,这意味着Compare本身属于该类型。

这些:

std::priority_queue<int, std::vector<int>, std::less<int>>;
std::priority_queue<int, std::vector<int>, std::greater<int>>;

虽然看起来相似,但有两种不同的类型。

您可以做的是调整Compare函数以查看某些外部状态并基于此进行排序。

这里重要的部分是不要将像std::priority_queue这样的有序容器视为排序的,因为它们实际上不是。相反,顾名思义,它们是有序的。并且只有在将新元素实际插入容器时将新元素放在其有序位置才能完成排序。容器无需重新排序。

因此,实际上不可能在运行时更改顺序,因为队列中的所有现有元素仍将按插入时的方式排序,并且新元素可能不会放置在正确的位置,因为排序不再正确。

std::priority_queue重新排序的唯一方法是使用 new 排序函数创建一个新队列,然后将元素从旧队列复制到新队列。

最新更新