在STL比较(Comparators in STL)

2019-07-31 18:16发布

我使用的结构minHeap使用priority_queue。而函数comp打印使用STL给出的排序功能以相反的顺序号生成最小堆。 现在我的疑问是,我不能在功能排序结构minHeap使用和PriorityQueue中不能使用的功能补偿。

我觉得这两个是功能结构minHeap和比较类似。 请解释我什么时候使用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] << " " ;
    }
}

Answer 1:

你在一般追求的是什么时候使用的功能或何时使用仿函数 。

简短的回答是:当且仅当您需要在多个调用操作保持状态使用仿函数。 为了比较的功能,这是通常不是这种情况,但也有诸如蓄电池,平均器,最小/最大计算器等用途的其他实例

似乎还有一个问题涵盖类似的地面,可以帮助您与更多的细节和外部材料一些伟大的引用: 比较仿函数类型VS运营商<

至于通过实际功能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.


Answer 2:

您可以使用一个仿函数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;

因此,你需要一个类名(而不是一个实例)第三模板参数。 如果你想使用的功能,你必须使用一个指针函数类型为第三个模板参数,然后传递函数指针在构造函数:

priority_queue<int , vector<int> , bool (*)(int a, int b) > b(&comp);


文章来源: Comparators in STL