2

我有一个最小优先级队列向量,每个队列都使用自定义比较器类的不同实例创建。队列应该是有大小限制的,如果队列满了,只能插入优先级高于队列顶部的元素,并踢出顶部的元素。因此,在插入完整队列之前,我想使用队列自己的比较器将新元素与队列顶部进行比较,以避免插入/删除成本。是否可以在不重新创建比较器的情况下做到这一点?

编辑:@Kerrek 的 hack 真的很酷,但比较器必须由带有参数的构造函数创建,我应该提到这一点。所以我选择了@Spundun 的答案,我还使用了对底层容器的访问来加快打印速度。

4

2 回答 2

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
}
于 2013-01-10T23:46:49.300 回答
1

比较器是一个受保护的成员(名为 comp,+1 Nate)。因此,如果您从 stl 类派生自己的优先级队列类,并实现您描述为函数的功能(例如 insert_only_if_important() ),那么您可以从该函数中访问比较器。

于 2013-01-10T23:48:44.793 回答