Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 容器的访问比较器(C+;+;/STL)_C++_Stl_Priority Queue - Fatal编程技术网

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

C++ 容器的访问比较器(C+;+;/STL),c++,stl,priority-queue,C++,Stl,Priority Queue,我有一个最小优先级队列的向量,每个队列都是用自定义比较器类的不同实例创建的。队列的大小应该是有限的,如果队列已满,则只能插入优先级高于队列顶部的元素,并将顶部的元素踢出。因此,在插入完整队列之前,我想使用队列自己的比较器将新元素与队列顶部进行比较,以避免插入/删除成本。在不重新创建比较器的情况下,这可能吗 编辑: @Kerrek的方法真的很酷,但是比较器必须由带参数的构造函数创建,我应该提到这一点。所以我选择了@Spundun-answer,我还使用了对底层容器的访问来加快打印速度 比较器对象似

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

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

比较器对象似乎没有被
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
}
模板结构绑架\u比较器;
模板
结构绑架比较器
{
类型定义Cmp类型;
};
// ...
模板
无效插入(PQ&PQ,类型名称PQ::常量参考x)
{
typename绑架比较器::类型cmp;
//使用“cmp”比较pq.top()和x
}

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

您的意思是
容器::key\u compare()
?这在
std::queue
中毫无意义,我想你是说
std::priority\u queue
对吧?@KerrekSB是的,在大多数情况下,它都是我见过的(
comp
)的成员,我想你是对的,至少我从来没有见过它公开,而且我不认为标准要求它如此。编辑:刚刚检查过,它在标准中是受保护的。是的,@WhozCraig,你说得对,它是一个
std::priority\u队列
。我想它可能是。最终你还是自己提供谓词(除非你依赖默认的
std::less
,所以我不完全清楚它的好处是什么,但我相信你有你想要它的理由=p这将“创建”一个新的比较器。我不知道OP是否需要它。在C++11中,你也可以在比较器周围使用一个
reference\u wrapper
来保留对它的引用。@pmr:这有什么帮助?不会的。我误解了这个问题。OP需要一个访问比较器的通用方法。我错过了。