在运行时更改优先级队列的排序功能
Change sorting function of priority queue during runtime
我有一个带有自定义排序功能的 std::priority_queue
。在程序中的某个时刻,我想使用不同的函数重新组织队列。
这可能吗?或者我可以创建一个指向队列的指针,以便在需要时指向不同排序的队列吗?
这里的重要部分是不要将 std::priority_queue
之类的有序容器视为已排序,因为它们实际上不是。相反,顾名思义,它们是 有序。并且只有当新元素实际插入到容器中时,才通过将新元素放入它们的 ordered 位置来完成排序。容器没有重新排序。
因此实际上不可能在 运行 时更改顺序,因为队列中的所有现有元素仍将按照插入时的方式排序,并且新元素可能不会放入正确的地方,因为顺序不再正确。
重新排序 std::priority_queue
的唯一方法是使用新排序函数创建一个新队列,然后将元素从旧队列复制到新队列。
这是不可能的,因为赋予 priority_queue
的 Compare
函数是模板类型,这意味着 Compare
本身属于该类型。
这些:
std::priority_queue<int, std::vector<int>, std::less<int>>;
std::priority_queue<int, std::vector<int>, std::greater<int>>;
虽然看起来相似,但有 2 种不同的类型。
您可以做的是调整您的Compare
函数以查看一些外部状态并根据它进行排序。
我有一个带有自定义排序功能的 std::priority_queue
。在程序中的某个时刻,我想使用不同的函数重新组织队列。
这可能吗?或者我可以创建一个指向队列的指针,以便在需要时指向不同排序的队列吗?
这里的重要部分是不要将 std::priority_queue
之类的有序容器视为已排序,因为它们实际上不是。相反,顾名思义,它们是 有序。并且只有当新元素实际插入到容器中时,才通过将新元素放入它们的 ordered 位置来完成排序。容器没有重新排序。
因此实际上不可能在 运行 时更改顺序,因为队列中的所有现有元素仍将按照插入时的方式排序,并且新元素可能不会放入正确的地方,因为顺序不再正确。
重新排序 std::priority_queue
的唯一方法是使用新排序函数创建一个新队列,然后将元素从旧队列复制到新队列。
这是不可能的,因为赋予 priority_queue
的 Compare
函数是模板类型,这意味着 Compare
本身属于该类型。
这些:
std::priority_queue<int, std::vector<int>, std::less<int>>;
std::priority_queue<int, std::vector<int>, std::greater<int>>;
虽然看起来相似,但有 2 种不同的类型。
您可以做的是调整您的Compare
函数以查看一些外部状态并根据它进行排序。