Я реализую алгоритм Дейкстры и хотел бы использовать 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 ()’ не имеет смысла для меня. Любая помощь будет оценена.
По существу, operator()
«просто» другой оператор, который может быть перегружен, поэтому все, что вы знаете о перегрузке операторов, все еще применяется — это полезно, потому что его можно применять к объекту с тем же синтаксисом, который вы могли бы использовать для вызова функции, например,
MyClass f;
f(); // i.e. f.operator()();
Тем не менее, есть много, что можно сказать о функторах и т. Д. Помимо этого — вы можете сделать поиск в Google для функторов / объектов функций для получения дополнительной информации. Вот одна ссылка:
http://en.wikipedia.org/wiki/Function_object
В приведенном выше коде, priority_queue
берет функтор сравнения, который он использует для упорядочивания вещей, которые вы помещаете в очередь. Первая очередь (fifth
) использует нормальный порядок; вторая очередь (sixth
) использует обратный порядок.
Это оператор вызова функции, и вы можете использовать его следующим образом:
mycomparison mycomp; //defines an object
mycomp(1,2); // invokes operator()(int,int)
bool operator () ( const int &, const int & );
Это функция, перегрузка operator()
, который принимает два целых числа и возвращает логическое значение. const
означает, что значение не может быть изменено. Это означает постоянная.