ありますここでいくつかのことが間違っている
まず第一に、あなたは他のと同様に、イテレータを初期化していないと述べている:
list<vertex*>::iterator it = r_list->begin();
この操作を行うと、あなたのコードは、罰金になります。しかし、あなたのコードは悪い方法で行われます。
なぜヒープからリストを割り当てていますか?あなたのコードを見てください:あなたはメモリリークを持っています。あなたはどこにでもdelete r_list
を呼んでいません。
//create a list to hold the vertices
list<vertex*> r_list;
list<vertex*>::iterator it = r_list->begin();
r_list.insert(it, pr);
:
しかし、いっそのは、単にスタックにそれを行う:(boost::scoped_ptr
とboost::shared_ptr
をあなたがそうでなければC++ 11、ブースト同等物を持っている場合std::unique_ptr
、std::shared_ptr
)を使用すると、スマートポインタを使用する必要がある理由ですさらに、イテレーターを使って挿入することは、物事を遠くに進めています。ただ、push front()またはpush back()を使用します。
//create a list to hold the vertices
list<vertex*> r_list;
r_list.push_back(pr);
もう一つ:あなたのリストは、あなたが構築してきた頂点をoutlives場合、それは無効なものを指します。例えば
:
// global
list<vertex*> r_list;
void some_function(void)
{
//create the vertices
vertex r = {WHITE, NULL, NULL};
//create pointer to the vertex structures
vertex *pr = &r;
r_list.push_back(pr);
} // right here, vertex r stops existing: the list now contains an
// invalid pointer.
一つの解決策は、ヒープ割り当てられた頂点へのポインタを格納することです:
// global
list<vertex*> r_list;
void some_function(void)
{
//create the vertices
vertex *r = new vertex;
r->color = WHITE;
r->distance = 0;
r->parent = 0;
r_list.push_back(r);
}
は今も、関数の後にリストが有効なヒープ割り当てられた頂点を指しています。これで、リストの使用が終了したら、lsitを実行して各要素のdelete
に電話する必要があるという問題があります。この問題はBoost Pointer Container Libraryを使用することによって助けられます。
最良の方法は、しかし、ちょうど店が自分(というよりも、それらへのポインタ)を頂点にある:
//create a list to hold the vertices
list<vertex> r_list;
//create the vertices
vertex r = {WHITE, NULL, NULL};
r_list.push_back(r);
あなたはコンストラクタ頂点与えれば、あなたもちょうどその場でそれらを構築することができます。
struct vertex
{
int color;
int distance;
char parent;
vertex(int _color, int _distance, char _parent) :
color(_color),
distance(_distance),
parent(_parent)
{
}
};
//create a list to hold the vertices
list<vertex> r_list;
r_list.push_back(vertex(WHITE, NULL, NULL));
(これらは問題外なりました)ポインタを扱うときにまず、NULLが一般的にのみ使用され
。 、第二に
//create the vertices
vertex r = {WHITE, 0, 0};
constants
むしろ#define
よりも使用します:distance
とparent
はないポインタであるため、NULL
ではなく、それらを初期化するために0
を使用
#define NUM_VERTICES 8 // <- bad
const int NumberVertices = 8; // <- good
最後には、あなたの列挙型の名前を与える、または場所それは名前空間内にあります:
enum Color { WHITE, GRAY, BLACK };
これらの助けが欲しいです!
main関数の戻り値がありません – rfcoder89