这里有几件事是错误的。
首先,您没有像其他人所说的那样初始化迭代器:
list<vertex*>::iterator it = r_list->begin();
这样做,你的代码会很好。但是您的代码以一种糟糕的方式完成。
为什么要从堆中分配列表?查看您的代码:您有内存泄漏。你没有delete r_list
在任何地方打电话。这就是为什么你应该使用智能指针(std::unique_ptr
如果std::shared_ptr
你有 C++11,则提升等价物: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.
一种解决方案是存储指向堆分配顶点的指针:
// 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 通常只在处理指针时使用。因为distance
andparent
不是指针,所以用它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 };
希望这些帮助!