En utilisant le priority_queue
STL, j'obtiens l'erreur "tas invalide" dès que j'essaie d'utiliser pop()
. Je peux pousser mes valeurs dans la file d'attente, le top()
de la file d'attente est ce que je m'attendais et accessible. pop()
, quand il va re-tas, semble avoir un problème.La file d'attente de priorité de bibliothèque de modèles standard C++ renvoie une exception avec le message "Heap invalide"
Je stocke des pointeurs vers une classe basée sur un modèle dans la file d'attente. Je le comparision surchargé:
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();
}
}
};
Le priority_queue
est membre privé d'une classe:
priority_queue< Vertex<type>*, vector< Vertex<type>* >, vertexPriorityCompare<type> > Q;
Les travaux de surcharge de la façon qu'il le fait, car une distance négative est considéré comme infini, toujours plus grand que n'importe quoi d'autre; pour représenter l'infini, les distances sont initialisées à -1. La file d'attente doit garder le plus petit, mais non négatif au sommet.
Je déréférence les pointeurs dans la surcharge, est ce que je fais là permise? Et, y a-t-il un autre opérateur que je dois surcharger?
Je voudrais joindre le code, mais il semble que si je le fais, il effraie les gens. Demande d'en voir plus et je vais attacher à un autre message. Je déclare dynamiquement un tableau de pointeurs sur des pointeurs, ceux-ci sont poussés, car je suppose que priority_queue
stocke par référence, donc si je mets juste un pointeur déclaré dans la boucle dans la file, ce pointeur sort de la portée. Ces pointeurs pointent vers le bon Vertex<type>
, et existent tout au long de la fonction.
Visual Studio 2008 débogueur me prend en ligne 'stdthrow.cpp' 24.
veuillez formater votre code – cbrulak
Le débogueur Visual Studio doit également vous donner une pile d'appel. Cela pourrait être utile aussi. – MSN