C ++指针和结构的邻接列表

时间:2012-06-08 00:01:22

标签: c++ list struct directed-graph

处理邻接列表 - >有向加权图

一个类看起来像这样,即标题:

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创建一个数组(尝试并仍然写入并获得内存错误)。没有编译器错误。

1 个答案:

答案 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 = v1m_myMap->verts是一个指针。您刚刚创建了m_myMap,因此verts未初始化,因此指向随机的内存块。然后,您尝试通过m_myMap->verts->m_vert = v1取消引用它。这不行。您需要先创建verts,即verts = new CNode;

  • typedef struct edges { /* etc */ } edge;是一个C构造,C ++中不需要typedef包装器。它确实有效,但它确实是多余的,许多构造只会污染你正在使用的命名空间。

  • 你真的需要指针吗?您提供的代码段并未暗示您需要使用它们的原因。您将希望将指针的使用减少到最少(或者至少使用智能指针,见上文)