我定义了一个类,然后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;
}
请问这是为什么??
迷茫2017-04-17 15:20:00
これは解決しました。皆さん、ありがとうございます。関数ポインタを渡すときに、
は次のように記述する必要があります:
priority_queue<Foo、vector<Foo> ;, decltype(cmp)* >que(cmp);
高洛峰2017-04-17 15:20:00
関数ポインターはデフォルトでは構築できないため、コンストラクターのパラメーターで関数名を渡す必要があると思います。 struct cmp
には自動的に構築できるデフォルトのコンストラクターがあるため、それを再度渡す必要はありません。
PHPz2017-04-17 15:20:00
テンプレート <クラス T, クラス Container = ベクトル<T>,
クラス比較 = less<typename Container::value_type> >クラス優先キュー;
Compare - 厳密な弱い順序付けを提供する比較タイプ。
cmp はクラス * ではなく、クラスである必要があります。