访问容器比较器(C ++ / STL)

时间:2013-01-10 23:36:23

标签: c++ stl priority-queue

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

编辑: @Kerrek的hack非常酷,但比较器必须由带参数的构造函数创建,我应该提到它。所以我使用@Spundun答案,我也使用了访问底层容器以加快打印速度。

2 个答案:

答案 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()),那么您可以从该函数中访问比较器。