优先级队列比较

时间:2013-12-29 14:22:03

标签: c++ priority-queue

我正在尝试使用自定义比较函数在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'

有没有办法创建一个类似于此但不使用类的比较函数?

由于

6 个答案:

答案 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;

http://ideone.com/KDOkJf

如果无法使用标准库仿函数表示比较函数(如果在优先级队列中使用自定义类),我建议编写自定义仿函数类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;
}