Инициализация приоритетной_очереди С++. Почему мы можем игнорировать const Compare&

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++ 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.

Кроме того, почему иногда он перегружает "‹" в качестве компаратора. Иногда перегружает "()" в качестве компаратора? спасибо


person BufBills    schedule 24.07.2014    source источник


Ответы (1)


Сравнение по умолчанию — std::less< Star >, которое вызовет operator <, которое вы определили.

Параметры типа шаблона могут иметь аргументы по умолчанию, как и параметры функции. То же самое и с типом контейнера по умолчанию — std::vector< Star >. На самом деле вы можете написать объявление просто как

priority_queue<Star> max_heap;

Кроме того, почему иногда он перегружает «‹» в качестве компаратора. Иногда перегружает "()" как компаратор?

Компаратор всегда является объектом Callable, то есть функцией или подобным функции объектом (функтор). Сравниваемые объекты передаются с помощью нотации вызова функции в круглых скобках. 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 < происходит так.

person Potatoswatter    schedule 24.07.2014
comment
std::less — это адаптер, который делает данную перегрузку bool operator‹ (T, T) доступной в качестве члена operator() функтора. Эту фразу трудно понять. SИзвините, английский не является моим родным языком. - person BufBills; 24.07.2014
comment
@NoName Добавлено уточнение. - person Potatoswatter; 24.07.2014