Перегрузка оператора ‘operator ()’

Я реализую алгоритм Дейкстры и хотел бы использовать STL ‘priority_queue’ для ускорения процесса кодирования, но, как это часто случается с моими попытками кодирования на C ++, мое отсутствие понимания языка замедляет меня. Я нашел этот пример на http://www.cplusplus.com/reference/stl/priority_queue/priority_queue/, но не понимаю, что делает следующее:

// constructing priority queues
#include <iostream>
#include <queue>
using namespace std;

class mycomparison
{
bool reverse;
public:
mycomparison(const bool& revparam=false)
{reverse=revparam;}
bool operator() (const int& lhs, const int&rhs) const
{
if (reverse) return (lhs>rhs);
else return (lhs<rhs);
}
};

int main ()
{
int myints[]= {10,60,50,20};

priority_queue<int> first;
priority_queue<int> second (myints,myints+4);
priority_queue< int, vector<int>, greater<int> > third (myints,myints+4);

// using mycomparison:
priority_queue< int, vector<int>, mycomparison > fourth;

typedef priority_queue<int,vector<int>,mycomparison> mypq_type;
mypq_type fifth (mycomparison());
mypq_type sixth (mycomparison(true));

return 0;
}

Чтобы быть более конкретным, ‘bool operator () (const int& lhs, const int&rhs) const ‘это то, что сбивает меня с толку. В остальном я в порядке. Я думаю, что это перегружает оператор, но ‘operator ()’ не имеет смысла для меня. Любая помощь будет оценена.

0

Решение

По существу, operator() «просто» другой оператор, который может быть перегружен, поэтому все, что вы знаете о перегрузке операторов, все еще применяется — это полезно, потому что его можно применять к объекту с тем же синтаксисом, который вы могли бы использовать для вызова функции, например,

MyClass f;
f(); // i.e. f.operator()();

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

http://en.wikipedia.org/wiki/Function_object

В приведенном выше коде, priority_queue берет функтор сравнения, который он использует для упорядочивания вещей, которые вы помещаете в очередь. Первая очередь (fifth) использует нормальный порядок; вторая очередь (sixth) использует обратный порядок.

2

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

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

mycomparison mycomp;  //defines an object
mycomp(1,2);  // invokes operator()(int,int)
1

bool operator () ( const int &, const int & );

Это функция, перегрузка operator(), который принимает два целых числа и возвращает логическое значение. const означает, что значение не может быть изменено. Это означает постоянная.

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