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

2

您需要实例化模板函数:

make_heap(arr,arr+size,HeapComparator<int>);
于 2013-11-12T08:24:46.747 回答
2

实例化模板时需要传递模板参数。还可以考虑将比较器的参数设为 const refs:

注意:我还对您的代码进行了其他几项改进——例如,我简化了 HashComparator。

注意 2:在这种特殊情况下,您可以将其用作std::greater<int>比较器而不是自定义比较器。

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

template <typename T>
bool HeapComparator (const T&,const 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<int>); 
  PrintArray(arr,size);

  return 0;
}   

template <typename T>
bool HeapComparator(const T& a,const T& b) {
  return a>b;
}
于 2013-11-12T08:27:00.980 回答
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 通用 lambda 将自动生成样板:

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

请注意,您的比较器计算!(a>b)a <= b不是有效的严格弱排序。将其转换为有效条件将产生a<b默认值。

于 2013-11-12T08:31:06.003 回答