Что такое «сравнить»? Если это указатель на функцию, вы должны быть очень осторожны, чтобы не использовать его, прежде чем указывать значение, так как сконструированное по умолчанию priority_queue будет использовать нулевой указатель. Самый простой способ обеспечить ненулевые указатели - если вы не можете переписать или перенести, как показано ниже - это, по иронии судьбы, никогда не использовать оператор индекса; вместо этого используйте методы поиска и вставки.
Если вместо «сравнить» используется функтор, его следует записать так, чтобы его конструкция по умолчанию выполняла именно то, что нужно (часто ничего), - очень редко это невозможно.
Когда компаратор в priority_queue имеет правильное значение (например, не пустой указатель в случае указателя), вы можете быть уверены, что ваши объекты будут упорядочены правильно.
Если у вас есть фиксированная функция и вы используете указатели функций:
bool my_compare(object_t *a, object_t *b) {
// do something
}
typedef bool (*compare)(object_t*, object_t*);
Переписать на:
struct compare {
bool operator()(object_t *a, object_t *b) {
// do something
}
};
Если вы не можете переписать функцию для сравнения (например, из какой-то сторонней библиотеки), вы можете обернуть (фиксированный) указатель на функцию в компараторе:
bool my_compare(object_t*, object_t*);
struct compare {
bool operator()(object_t *a, object_t *b) {
return my_compare(a, b);
}
};