STLpriority_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 デバッガーは、「stdthrow.cpp」の 24 行目に移動します。