Я реализую алгоритм кратчайшего пути Djikstra и использую очередь приоритетов, чтобы определить, какой узел будет посещать следующий, но я не могу использовать std :: priority_queue, потому что это приложение требует, чтобы куча была перестроена. Я написал свою собственную оболочку для функций std::make_heap()
, std::push_heap()
и std::pop_heap()
и я std::pop_heap()
свой собственный компаратор, но он возвращает ошибку нулевого указателя во время выполнения. У меня такое чувство, что я либо не передавал правильность указателя функции, либо не был правильно инициализирован указатель на функцию.
здесь код для инициализации указателя функции
bool ShortestDistToHere(const Node& lhs, const Node& rhs){
return distances[lhs.xpos][lhs.ypos] < distances[rhs.xpos][rhs.ypos];
}
bool (*shortestDist)(const Node& lhs, const Node& rhs) = &shortestDistToHere;
и здесь используется вызов функции
push_heap(queueVector.begin(), queueVector.end(), shortestDist);
Изменение: в комментариях я заметил, что произошла ошибка, когда она пыталась вызвать что-то в предикате. Ну, оказывается, что Visual Studio 11 не полностью соответствует спецификациям C++ (или документация просто неясна), потому что в ссылке говорилось, что третий аргумент make_heap был указателем функции или функциональным объектом, но на самом деле это был предикат. Если объект функции не является предикатом, то я все время делал это неправильно.
Правильный способ вызова push_heap()
-
push_heap(queueVector.begin(), queueVector.end(), ShortestDistToHere());
ему нужен экземпляр объекта-функтора.