我有一个最小优先级队列的向量,每个队列都使用不同的自定义比较器类实例创建。队列的大小应该是有限的,如果队列已满,只能插入优先级高于队列顶部的元素,并将元素置于顶部。因此,在插入完整队列之前,我想使用队列自己的比较器将新元素与队列顶部进行比较,以避免插入/删除成本。如果不重新创建比较器,这可能吗?
编辑: @Kerrek的hack非常酷,但比较器必须由带参数的构造函数创建,我应该提到它。所以我使用@Spundun答案,我也使用了访问底层容器以加快打印速度。
答案 0 :(得分:4)
看起来std::priority_queue
没有公开比较器对象,甚至不是它的类型。作为一个肮脏的黑客,并假设比较器是无状态和默认可构造的,你可以尝试这样的事情:
template <typename> struct kidnap_comparator;
template <typename T, typename Cnt, typename Cmp>
struct kidnap_comparator<std::priority_queue<T, Cnt, Cmp>>
{
typedef Cmp type;
};
// ...
template <typename PQ>
void insert_maybe(PQ & pq, typename PQ::const_reference x)
{
typename kidnap_comparator<PQ>::type cmp;
// use "cmp" to compare pq.top() and x
}
答案 1 :(得分:1)
比较器是受保护的成员(名为comp,+ 1 Nate)。因此,如果从stl类派生自己的优先级队列类,并实现您描述为函数的功能(比如insert_only_if_important()),那么您可以从该函数中访问比较器。