0
#include<iostream>
#include<algorithm>
using namespace std;

template <typename T>
bool HeapComparator (T,T);

template <typename T>
void PrintArray(T arr,int size)
{
    for(int i=0;i<size;i++)
  {
    cout<<arr[i]<<" ";
}
cout<<endl;
}

int main()
{
int arr[7]={1,4,2,5,7,6,3};
int size=7;
PrintArray(arr,size);

cout<<"Max Heap:"<<endl;
make_heap(arr,arr+size); //creates MAX Heap, as no comparator provided.
PrintArray(arr,size);

cout<<"Min Heap:"<<endl;
make_heap(arr,arr+size,HeapComparator); //compilation error here.
PrintArray(arr,size);

return 0;
}   

template <typename T>
bool HeapComparator(T a, T b)
{
if(a>b)
    return false;
else
    return true;
}

うまくいきません。テンプレート関数をコンパレータとして使用するには?

4

3 に答える 3

1

最も簡単な方法は、クラスにカプセル化することです。

struct HeapComparator {
    template <typename T>
    bool operator () (T,T);
};

make_heap(arr,arr+size,HeapComparator()); 

template <typename T>
bool HeapComparator::operator () (T a, T b)
{
if(a>b)
    return false;
else
    return true;
}

C++14 のジェネリック ラムダは、ボイラープレートを自動的に生成します。

make_heap(arr,arr+size,[]( auto a, auto b ) { return …; } ); 

コンパレータは!(a>b)orを計算することに注意してくださいa <= b。これは有効な厳密な弱い順序付けではありません。それを有効な条件にするa<bと、デフォルトの状態になります。

于 2013-11-12T08:31:06.003 に答える