我定义了一个类,然后priority_queue中存放类并且使用自己定义的比较函数,但是如果比较函数传递的是函数指针就会发生崩溃:
class Foo
{
friend bool cmp(Foo *, Foo *);
public:
Foo() = default;
Foo(int x):val(x) {}
private:
int val;
};
bool cmp(Foo *a, Foo *b)
{
return a->val < b->val;
}
int main()
{
priority_queue<Foo*, vector<Foo*>, decltype(cmp)*> que;
que.push(new Foo(5));
que.push(new Foo(6));
return 0;
}
如果改为函数对象则正常:
class Foo
{
friend struct cmp;
public:
Foo() = default;
Foo(int x):val(x) {}
private:
int val;
};
struct cmp
{
bool operator()(Foo *a, Foo *b)
{
return a->val < b->val;
}
};
int main()
{
priority_queue<Foo*, vector<Foo*>, cmp> que;
que.push(new Foo(5));
que.push(new Foo(6));
return 0;
}
请问这是为什么??
已经解决了,谢谢大家,因为传递函数指针的时候,没有初始化
应该写成这样:
priority_queue<Foo, vector<Foo>, decltype(cmp)*> que(cmp);
我觉得应该是函数指针需要你在构造函数的参数里面传递一个函数名,因为指针不能进行默认构造。而
struct cmp
有一个默认构造函数,可以自动构造,就不需要你再次传递了。template,; >类priority_queue;
class Compare = less
比较 - 提供严格弱排序的比较类型。
cmp 要为一个类,而且不是类 *。