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

Я реализую алгоритм Дейкстры и хотел бы использовать «priority_queue» STL для ускорения процесса кодирования, но, как это часто бывает с моими попытками кодирования на 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». В остальном меня все устраивает. Я думаю, что это перегрузка оператора, но «оператор ()» не имеет для меня смысла. Любая помощь будет оценена по достоинству.


person Daeden    schedule 18.11.2012    source источник
comment
Оглядываясь назад, можно сказать, что публиковать весь код, который я нашел, было плохой идеей, поскольку проблема, с которой я столкнулся, была связана только с перегруженным оператором.   -  person Daeden    schedule 18.11.2012


Ответы (3)


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

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

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

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

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

person Stuart Golodetz    schedule 18.11.2012
comment
+1 за упоминание функторов! Добавляю вашу ссылку в свой список для чтения. - person Daeden; 18.11.2012

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

mycomparison mycomp;  //defines an object
mycomp(1,2);  // invokes operator()(int,int)
person IronMensan    schedule 18.11.2012
comment
Я, вероятно, проделал ужасную работу, объясняя свою проблему с тем, что было перегружено, но демонстрация того, как можно вызвать оператор, была действительно полезной! - person Daeden; 18.11.2012

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

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

person template boy    schedule 18.11.2012