我正在尝试使用自定义比较函数在c ++中声明优先级队列...
所以,我按如下方式声明队列:
std::priority_queue<int,std::vector<int>, compare> pq;
这是比较功能:
bool compare(int a, int b)
{
return (a<b);
}
我很确定我之前没有类,以类似的方式做过这个,但是现在,这段代码没有编译,我得到了这样的几个错误:
type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
有没有办法创建一个类似于此但不使用类的比较函数?
由于
答案 0 :(得分:14)
模板参数应该是比较函数的类型。然后,该函数可以是默认构造的,也可以在priority_queue
的构造函数中传递函数。所以尝试
std::priority_queue<int, std::vector<int>, decltype(&compare)> pq(&compare);
或者不使用函数指针,而是使用标准库中的仿函数,然后可以默认构造,无需在构造函数中传递实例:
std::priority_queue<int, std::vector<int>, std::less<int> > pq;
如果无法使用标准库仿函数表示比较函数(如果在优先级队列中使用自定义类),我建议编写自定义仿函数类or use a lambda。
答案 1 :(得分:9)
您可以使用C ++ 11 lambda功能。您需要创建lambda对象,使用decltype
将其传递给模板,并将其传递给构造函数。它看起来像这样:
auto comp = [] (int &a, int &b) -> bool { return a < b; };
std::priority_queue<int,std::vector<int>, decltype(comp) > pq (comp);
答案 2 :(得分:6)
您必须指定函数类型并在priority_queue
构造函数中实例化该函数。
#include <functional>
bool compare(int a, int b)
{
return (a<b);
}
std::priority_queue<int, std::vector<int>,
std::function<bool(int, int)>> pq(compare);
答案 3 :(得分:2)
您可以使用typedef。编译得非常好:
typedef bool (*comp)(int,int);
bool compare(int a, int b)
{
return (a<b);
}
int main()
{
std::priority_queue<int,std::vector<int>, comp> pq(compare);
return 0;
}
答案 4 :(得分:2)
std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);
是另一种未提及的方式。
答案 5 :(得分:0)
这对我很有用。
struct compare{
bool operator() (const int& p1,const int& p2 ){
return p1<p2;
}
};
int main(){
priority_queue<int,vector<int>, compare > qu;
return 0;
}