【问题标题】:C++ adjacency list of pointers and structs指针和结构的 C++ 邻接列表
【发布时间】:2012-06-08 00:01:21
【问题描述】:

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

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

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 创建一个数组(尝试过并且仍然会重写并且也会出现内存错误)。没有编译器错误。

【问题讨论】:

  • “不工作” - 请更具描述性。什么不工作,你做了什么调试?
  • 已编辑,真的只是对我如何处理指针以不覆盖以前的数据感到困惑。

标签: c++ list struct directed-graph


【解决方案1】:

我不知道如何在不覆盖它们的情况下创建指向列表的指针。

除了您的应用程序之外,此问题的答案是 new 运算符,我假设您知道,因为您在示例代码中使用了它。像int * a = new int(42); 这样的代码会在堆上为int 分配内存,当不再需要它时,你负责清理它。因此,您可以完全控制变量可用的时间。另一方面,在int x = 42; int * a = &amp;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-&gt;verts-&gt;m_vert = v1m_myMap-&gt;verts 是一个指针。您刚刚创建了m_myMap,因此verts 未初始化,因此指向随机的内存块。然后,您尝试通过 m_myMap-&gt;verts-&gt;m_vert = v1 取消引用它。这行不通。您需要先创建verts,即verts = new CNode;

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

  • 你真的需要指针吗?您提供的 sn-ps 并未暗示您为什么需要使用它们。您将希望将指针的使用减少到最低限度(或至少使用智能指针,见上文)

【讨论】:

  • 谢谢,我是个十足的傻瓜**。我试图在错误的位置创建图表。我最终从 AddMap 和 AddEndVert 创建了指向我的列表的指针。谢谢你的帮助。 typedef 之类的一些东西不是我写的,而是别人写的。但再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多