#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;
}
它不起作用。如何使用模板函数作为比较器?
答案 0 :(得分:2)
您需要实例化模板功能:
make_heap(arr,arr+size,HeapComparator<int>);
答案 1 :(得分: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;
}
答案 2 :(得分: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通用lambdas将自动生成样板:
make_heap(arr,arr+size,[]( auto a, auto b ) { return …; } );
请注意,您的比较器会计算!(a>b)
或a <= b
,这不是有效的严格弱排序。将其转换为有效条件将产生a<b
,这是默认值。