6

struct minHeapを使用して、priority_queueを使用して最小ヒープを生成しています。また、関数compを使用して、STLで指定された並べ替え関数を使用して数値を逆の順序で出力します。今、私の疑問は、関数の並べ替えでstruct minHeapを使用できず、priorityQueueで関数compを使用できないことです。

structminHeapとcompの両方の機能は似ていると思います。いつcomapratorに構造体を使用するか、STLでコンパレータとして動作するために通常の関数をいつ使用するかを説明してください。

#include<iostream>
#include <queue>
#include <stdio.h>
#include<algorithm>
using namespace std;

struct minHeap
{
    bool operator()(const int a , const int b )
    {
        return a>b;
    }
};
bool comp(int a , int b)
{
    return a>b;
}

int main()
{
    priority_queue<int , vector<int> , minHeap > b;

    b.push(4);
    b.push(23);
    b.push(12);
    while(b.size()!=0)
    {
        cout << b.top() << " " ;
        b.pop();
    }
    cout<<"\n" ;
    int arr[] = {12,34, 112,12};
    sort(arr , arr+4  ,comp);

    for(int x= 0 ; x < 4 ; x++)
    {
        cout << arr[x] << " " ;
    }
}
4

2 に答える 2

6

一般的に探しているのは、関数を使用する場合、またはファンクターを使用する場合です。

簡単な答えは次のとおりです。オペレーターへの複数の呼び出しにわたって状態を保持する必要がある場合にのみ、ファンクターを使用します。比較関数の場合、これは通常は当てはまりませんが、アキュムレータ、平均化器、最小/最大計算機などの他の使用例があります。

同様の根拠をカバーしているようで、外部資料への詳細といくつかの優れた参照に役立つ可能性のある別の質問:ファンクタータイプとオペレーターの比較<

実際の関数をpriority_queueに渡すことに関しては、それほど明白ではありませんが、可能です。

typedef bool(*CompareFunc)(float, float); // You need to have your function pointer 
                                          // type available
bool Compare(float i_lhs, float i_rhs)    // The actual compare function matching the 
  {                                       // CompareFunc type
  // Do your compare stuff here.
  }

...
std::priority_queue<float, std::vector<float>, CompareFunc> p(Compare);
// Tell priorityqueue you're passing a compare *function*, and pass the actual function
// as a parameter.
于 2012-09-20T08:16:16.190 に答える
5

でファンクターを使用できますがsort()、まったく問題ありません。

sort(arr , arr+4  ,minHeap());

おそらくあなたの問題はminHeap、ファンクターのインスタンスの代わりにクラス名()を使用していることでした。minHeap()はコンストラクターの呼び出しであり、ではありませんoperator()

についてpriority_queueは、次のように指定されます。

template < class T, class Container = vector<T>,
           class Compare = less<typename Container::value_type> > class priority_queue;

したがって、3番目のテンプレート引数には(インスタンスではなく)クラス名が必要です。関数を使用する場合は、3番目のテンプレート引数として関数型へのポインターを使用してから、コンストラクターで関数ポインターを渡す必要があります。

priority_queue<int , vector<int> , bool (*)(int a, int b) > b(&comp);
于 2012-09-20T08:47:35.500 に答える