0
class Star {
 public:
  // The distance between this star to the Earth.
  double distance() const { return sqrt(x_ * x_ + y_ * y_ + z_ * z_); }

  bool operator<(const Star& s) const { return distance() < s.distance(); }

  int ID_;
  double x_, y_, z_;
};



priority_queue<Star, vector<Star>> max_heap;

看最后一行。这是priority_queue max_heap 的初始化。为什么它忽略 c++ const Compare&。我以为会

priority_queue<Star, vector<Star>, Star> max_heap;

它看起来与下面的不同,我理解。

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};

  std::priority_queue<int> first;
  std::priority_queue<int> second (myints,myints+4);
  std::priority_queue<int, std::vector<int>, std::greater<int> >
                            third (myints,myints+4);
  // using mycomparison:
  typedef std::priority_queue<int,std::vector<int>,mycomparison> mypq_type;

  mypq_type fourth;                       // less-than comparison
  mypq_type fifth (mycomparison(true));   // greater-than comparison

  return 0;
}

我读了这个页面: http ://www.cplusplus.com/reference/queue/priority_queue/priority_queue/

无法获得priority_queue 构造函数范式的明确定义。

另外,为什么有时它会重载“<”作为比较器。有时重载“()”作为比较器? 谢谢

4

1 回答 1

3

默认比较是std::less< Star >调用operator <你定义的。

模板类型参数可以有默认参数,就像函数参数一样。这与默认容器类型相同,即std::vector< Star >. 实际上,您可以将声明简单地写为

priority_queue<Star> max_heap;

另外,为什么有时它会重载“<”作为比较器。有时重载“()”作为比较器?

比较器始终是一个 Callable 对象,即一个函数或类函数对象(functor)。要比较的内容使用带括号的函数调用表示法传递。std::less是适配器,它使给定的bool operator< (T, T)重载可以作为operator()仿函数的成员访问。

例如,这里是如何std::less实现的:

template< typename T >
struct less {
    bool operator () ( T const & lhs, T const & rhs ) const
        { return lhs < rhs; } // Calls Star::operator < ()
};

std::less实际上是一个对象类型,而这样的对象实际上是存储在priority_queue. 这operator()就是进行比较的原因。对您的呼叫以operator <这种方式发生。

于 2014-07-24T02:05:23.120 回答