Я реализую алгоритм A*, используя std::priority_queue в openSet. В какой-то момент алгоритма, как в псевдокоде Википедии:
else if tentative_g_score < g_score[neighbor]
tentative_is_better := true
с последующим
if tentative_is_better = true
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := g_score[neighbor] + h_score[neighbor]
означает, что нужно выполнить поиск по priority_queue и изменить значение одного из их элементов, что невозможно (насколько я понял).
Также в этой строке:
if neighbor not in openset
нельзя выполнять поиск в очереди с приоритетом, и поэтому это невозможно реализовать в очереди с приоритетом, что я решил, создав std::set, который только сообщает нам, какие элементы находятся в openSet (так что, когда я добавляю/удаляю один элемент в openSet, я добавляю/удаляю как std::set, так и std::priority_queue).
Итак, мне интересно, как мне избежать первой проблемы или какой std::container действительно следует использовать для этой конкретной (но общей A *) реализации.
В более общем плане мне интересно, какой эффективный подход к A * с использованием стандартных контейнеров?