0

我正在实现 Dijkstra 的算法,我想使用 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()”对我来说毫无意义。任何帮助,将不胜感激。

4

3 回答 3

2

本质上,operator()“只是”另一个可以重载的运算符,因此您所知道的有关运算符重载的所有内容仍然适用 - 它很有用,因为它可以应用于具有与调用函数相同的语法的对象,例如

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

也就是说,除此之外,关于函子等还有很多可以说的——您可能想在 Google 上搜索函子/函数对象以获取更多信息。这是一个链接:

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

在上面的代码中,priority_queue采用了一个比较函子,用于对放入队列中的内容进行排序。第一个队列 ( fifth) 使用正常排序;第二个队列 ( sixth) 使用反向排序。

于 2012-11-18T03:01:06.620 回答
1

那是函数调用运算符,您可以像这样使用它:

mycomparison mycomp;  //defines an object
mycomp(1,2);  // invokes operator()(int,int)
于 2012-11-18T03:02:39.570 回答
0
bool operator () ( const int &, const int & );

这是一个函数,是 的重载operator(),它接受两个整数并返回一个布尔值。const表示该值不能更改。它代表常数

于 2012-11-18T03:01:36.650 回答