указатели на функции c ++, дающие ошибку времени выполнения при передаче в push_heap

0

Я реализую алгоритм кратчайшего пути 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 был указателем функции или функциональным объектом, но на самом деле это был предикат. Если объект функции не является предикатом, то я все время делал это неправильно.

  • 3
    Что такое "расстояния"? Можете ли вы показать его объявление / инициализацию?
  • 0
    Расстояния - это массив int [250] [200], который содержит текущее кратчайшее расстояние, чтобы добраться до узла, следующий узел, который нужно посетить, это тот, у которого самое короткое расстояние, как в графике со всеми ненулевыми ребрами, гарантируется, что это кратчайший путь к этому узлу.
Показать ещё 4 комментария
Теги:
pointers
c++11

1 ответ

0

Правильный способ вызова push_heap() -

push_heap(queueVector.begin(), queueVector.end(), ShortestDistToHere());

ему нужен экземпляр объекта-функтора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню