![](/img/trans.png)
[英]Passing a function_pointer as a comparator in a stl make_heap c++
[英]How to use template function as comparator in STL algorithm ex: make_heap
#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;
}
沒用 如何使用模板功能作為比較器?
您需要實例化模板函數:
make_heap(arr,arr+size,HeapComparator<int>);
實例化模板時,需要傳遞template參數。 還可以考慮將比較器的參數設為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;
}
最簡單的方法是將其封裝在一個類中。
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.