ここにはいくつか間違っていることがあります。
まず、他の人が言っているように、イテレータを初期化していない:
list<vertex*>::iterator it = r_list->begin();
これを行うと、コードは正常になります。しかし、あなたのコードは悪い方法で行われています。
なぜヒープからリストを割り当てるのですか?コードを見てください。メモリリークがあります。あなたはdelete r_list
どこにも電話をかけていません。これが、スマートポインタを使用する必要がある理由です(C ++ 11を使用している場合は、同等のものをブーストしますstd::unique_ptr
:および)std::shared_ptr
boost::scoped_ptr
boost::shared_ptr
しかし、さらに良いことに、スタック上でそれを実行してください。
//create a list to hold the vertices
list<vertex*> r_list;
list<vertex*>::iterator it = r_list->begin();
r_list.insert(it, pr);
さらに、イテレータを使用して挿入することは、長い道のりを進んでいます。push front()またはpush back()を使用するだけです:
//create a list to hold the vertices
list<vertex*> r_list;
r_list.push_back(pr);
別のこと:あなたのリストがあなたが構築した頂点よりも長生きする場合、それは何か無効なものを指しているでしょう。
例えば:
// 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.
1つの解決策は、ヒープに割り当てられた頂点へのポインタを格納することです。
// 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 PointerContainerLibraryを使用することで支援されます。
ただし、最良の方法は、頂点自体を(それらへのポインタではなく)格納することです。
//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は通常、ポインタを処理する場合にのみ使用されます。distance
とparent
はポインタではないので、 :0
ではなく、それらを初期化するために使用します。NULL
//create the vertices
vertex r = {WHITE, 0, 0};
次に、次ではconstants
なく使用し#define
ます。
#define NUM_VERTICES 8 // <- bad
const int NumberVertices = 8; // <- good
最後に、列挙型に名前を付けるか、名前空間に配置します。
enum Color { WHITE, GRAY, BLACK };
これらの助けを願っています!