questionがあり、C++のpriority_queue
でコンパレータを使用する方法について説明しています。彼は第3引数としてオーバーロードされたoperator
class
(またはstruct
)を与え、正常に動作します。しかし、bool
機能が動作しません。どうして ?しかし<algorithm>
のsort
で正常に動作します。ドキュメント(priority_queue & & algo/sort)を調べると、両方ともオプションの第3引数としてclass Compare
が使用されます。関数コンパレータがソートのように優先度キューで動作しないのはなぜですか?
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp (const int &a,const int &b){ return a > b; }
struct cmp2
{
bool operator() (const int &p1,const int &p2)
{
return p1 > p2;
}
};
int main()
{
// freopen("test.txt","r",stdin);
int a[10];
vector<int> b(10);
sort(a , a + 10, cmp); // working cool
sort(b.begin() , b.end() , cmp); // working great
priority_queue<int, vector<int> , cmp2 > x; // as usual, working....
priority_queue<int, vector<int> , cmp > y; // not working why ?
return 0;
}
エラー:
A:\pqvsarray.cpp In function 'int main()':
27 40 A:\pqvsarray.cpp [Error] type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
27 40 A:\pqvsarray.cpp [Error] expected a type, got 'cmp'
27 43 A:\pqvsarray.cpp [Error] invalid type in declaration before ';' token
それでは、なぜ違いは?
priority_queueテンプレートには型が必要ですが、関数ポインタを指定しているためです。 –
なぜ、 'sort'は'関数ポインタ 'を取るのですか? – azam
@SelçukCihan[priority_queueのドキュメント](http://www.cplusplus.com/reference/queue/priority_queue/)によれば、関数ポインタにすることができます:*これは関数ポインタまたは関数オブジェクトです。* – Aracthor