处理邻接列表 - >有向加权图
一个类看起来像这样,即标题:
class CGraph;
class CMap {
public:
//voided constructors and destructors
//functions one is:
void SetDirGraph(string commands);
private:
CGraph* m_myMap;
};
第二课:
class CNode {
public:
//voided constructor and desctructor
int m_distance, m_vert;
bool m_isKnown;
};
typedef struct edges {
int v2, weight;
} edge;
class CGraph {
public:
CGraph(int map_size);
~CGraph(void);
void AddMap(int v1, int v2, int weight);
void AddEndVert(int v2, int weight);
private:
list<edge> List;
int size;
public:
CNode* verts;
};
我正在从文件中读取顶点,这是有效的。我的问题是我在根据给定的代码创建邻接列表时遇到问题。我试图首先使用指向列表的指针,但它无法正常工作。我不知道如何创建指向列表的指针而不写入它们。
void CMap::SetDirGraph(string command) {
istringstream buffer(command)
char ch;
int num, vert1, vert2, weight; //specify vertices and weight and number of vertices
buffer>>ch; //throw away first character (not needed)
buffer>>num // size of vertices
while(!buffer.eof()) { // keep reading until end of line
buffer>>v1; // vertex start
buffer>>v2; // vertex end
buffer>>weight;
m_myMap = new CGraph(map_size); //initialize m_myMap.
m_myMap->verts->m_vert = v1; // mymap->verts->vert points to first edge
m_myMap->AddMap(v1, v2, weight); // create list?
m_myMap->AddEndVert(v2, weight); //create list? push v2 and weight on my list using my list.
}
}
我尝试了几种不同的方法,我一直在困惑自己,正确方向的任何一点都会很棒。
编辑: 如果需要制作,我也有更多的代码,只需发布主要内容。 “不工作”的意思是我只是在写上一个顶点。我不知道是否应该使用m_myMap创建一个数组(尝试并仍然写入并获得内存错误)。没有编译器错误。
答案 0 :(得分:1)
我不知道如何创建指向列表的指针而不写入它们。
除了你的应用程序之外,这个问题的答案是new
运算符,我假设你知道,因为你在示例代码中使用了它。像int * a = new int(42);
这样的代码为堆上的int
分配内存,并且当不再需要时,您负责清理它。因此,您可以完全控制变量的可用时间。另一方面,在int x = 42; int * a = &x;
中,x
将在超出范围时自动清除,a
将成为指向内存块的指针,该内存块中不再包含有意义的数据。如果你试图取消引用它,你会遇到未定义的行为,如果你运气好,你的程序会爆炸。
如果您可以使用C ++ 11标准或提供智能指针的库,那么您应该更喜欢那些尽可能自己管理指针的人。智能指针是一个对象,它保存已分配的内存并在销毁时自动释放它。更具体的信息在很大程度上取决于您使用的是哪种智能指针。使用智能指针的原因是自己进行管理是单调乏味且容易出错的。如果你没有delete
你分配的指针,你的应用程序将继续分配更多的内存,直到它有一天爆炸(取决于你分配的频率和内存量);这被称为泄漏。如果您不止一次致电delete
,您的计划也会纾困。以下是应用程序中C ++ 11 shared_ptr
的示例:
class CMap
{
private:
std::shared_ptr<CGraph> m_myMap;
// etc.
};
// in SetDirGraph
m_myMap.reset( // if the smart pointer has previously been managing
// memory, it will free it before allocating new
new CGraph(map_size) // allocate CGraph as before
);
除此之外,有希望回答你的问题,我遇到了一些与你的代码有关的潜在问题:
绝对错误:
在SetDirGraph
中设置了m_myMap->verts->m_vert = v1
。 m_myMap->verts
是一个指针。您刚刚创建了m_myMap
,因此verts
未初始化,因此指向随机的内存块。然后,您尝试通过m_myMap->verts->m_vert = v1
取消引用它。这不行。您需要先创建verts
,即verts = new CNode;
。
typedef struct edges { /* etc */ } edge;
是一个C构造,C ++中不需要typedef
包装器。它确实有效,但它确实是多余的,许多构造只会污染你正在使用的命名空间。
你真的需要指针吗?您提供的代码段并未暗示您需要使用它们的原因。您将希望将指针的使用减少到最少(或者至少使用智能指针,见上文)