Используя STL priority_queue
, я получаю ошибку "недопустимая куча", как только я пытаюсь использовать pop()
. Я могу поместить свои значения в очередь, top()
очереди - это то, что я ожидаю и доступно. pop()
, когда он переходит в кучу, кажется, есть проблема.
Я храню указатели на шаблонный класс в очереди. У меня перегружено сравнение:
template <class type>
class vertexPriorityCompare
{
public:
bool operator()(Vertex<type>* leftVertex, Vertex<type>* rightVertex) const
{
if(leftVertex->getDistanceFromSource() < 0 && rightVertex->getDistanceFromSource() < 0)
{
return false;
}
else if(leftVertex->getDistanceFromSource() < 0)
{
return true;
}
else if(rightVertex->getDistanceFromSource() < 0)
{
return false;
}
else
{
return leftVertex->getDistanceFromSource() > rightVertex->getDistanceFromSource();
}
}
};
priority_queue
является приватным членом класса:
priority_queue< Vertex<type>*, vector< Vertex<type>* >, vertexPriorityCompare<type> > Q;
Перегрузка работает так, как она работает, потому что отрицательное расстояние считается бесконечностью, всегда больше, чем все остальное; чтобы представить бесконечность, расстояния инициализируются до -1. Очередь должна быть наименьшей, но неотрицательной наверху.
Я разыменую указатели в перегрузке, допустимо ли то, что я там делаю? И есть ли другой оператор, который мне нужен для перегрузки?
Я бы прикрепил код, но, кажется, если я это сделаю, это отпугнет людей. Просьба видеть больше, и я прикреплю к другому сообщению.
Я динамически объявляю массив указателей на указатели, это то, что запихивается, потому что я предполагаю, что priority_queue
хранится по ссылке, поэтому, если я просто помещу указатель, объявленный в цикле, в очередь, этот указатель выходит из области видимости , Эти указатели указывают на правильный Vertex<type>
и существуют во всей функции.
Отладчик Visual Studio 2008 переводит меня в строку 24 stdthrow.cpp.