Компараторы в STL

Я использую struct minHeap для генерации кучи min, используя priority_queue. И функцию comp для печати чисел в обратном порядке, используя функцию сортировки, заданную в STL. Теперь я сомневаюсь, что я не могу использовать struct minHeap в функции sort и не могу использовать функцию comp в priorityQueue.

Я чувствую, что функция как struct minHeap, так и comp одинакова. Пожалуйста, объясните мне, когда использовать структуры для 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] << " " ;
}
}

5

Решение

В общем, вы ищете, когда использовать функции или когда использовать функторы.

Краткий ответ: используйте функтор тогда и только тогда, когда вам нужно сохранить состояние при нескольких вызовах к оператору. Для функций сравнения это обычно не так, но есть и другие случаи использования, такие как аккумуляторы, усреднители, мин / макс калькуляторы и т. Д.

Еще один вопрос, который, кажется, охватывает аналогичные вопросы и может помочь вам более подробно и с некоторыми отличными ссылками на внешний материал: Типы функторов сравнения и операторы<

Что касается передачи фактической функции в 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.
6

Другие решения

Вы можете использовать функтор в 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);
5

По вопросам рекламы [email protected]