очередь с приоритетами — инициализация c ++ priority_queue. Почему мы можем игнорировать const Compare & amp;

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. Почему это игнорирует const c ++&,
Я думал, что это будет

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.

Кроме того, почему иногда это перегружает<«как компаратор. Иногда перегружает» () «как компаратор?
Спасибо

0

Решение

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

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

priority_queue<Star> max_heap;

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

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

3

Другие решения


По вопросам рекламы [email protected]