【问题标题】:What is a good and stable way to implement graphs and trees using STL in C++?在 C++ 中使用 STL 实现图形和树的一种良好且稳定的方法是什么?
【发布时间】:2014-10-20 16:51:01
【问题描述】:

作为二叉树和邻接表的经典指针表示的替代方案,什么是使用 C++ 中的 STL 实现图和树的好方法,以使其动态化并最大限度地减少内存泄漏和段错误。

我发现的邻接列表的一个这样的实现是在结构中使用 STL 列表,

struct Node {
    int data;
    list<int> adj;
};

然后声明一个结构指针数组

struct Node *nodes[10005];

但这一切都是在考虑整数数据,如果要存储的数据不是整数怎么办,如何最大限度地利用STL?

【问题讨论】:

  • "以便使其动态化并最大限度地减少内存泄漏和段错误" ... "然后声明一个结构指针数组"。如果您正在寻找动态大小和安全的段错误,那么静态大小的原始数组肯定不是要走的路。
  • what if the data to be stored is not integer - 使用模板。我不知道您将如何编写数据结构,但节点向量可能比任意数量的固定数组更好。

标签: c++ graph stl tree implementation


【解决方案1】:

使用模板类 例如

template<class t1>
class node
{
 public:
    t1 value;
    node * link;
    void getdata(t1 val)
       {
        value=val;
       }
 };

现在您可以处理任何类型的数据

【讨论】:

    【解决方案2】:

    这在很大程度上取决于如何处理这些结构。让我们从您的第二个问题开始 - 使用任何类型,应用模板

    template<class T>
    class Node
    {
     public:
       T value;
       std::list<int> nodeIndices;
    }
    
    struct Node *nodes[10005];
    

    如果您希望在单个图形结构中使用不同的类型,请将上述与继承结合起来

    class BaseNode
    {
     public:
       std::list<int> nodeIndices;
       // some functions  
    };
    
    template<class T>
    class Node : public BaseNode
    {
     public:
       T value;
    }
    
    struct BaseNode *nodes[10005];
    

    这样您可以存储不同类型的对象。另一种说法可能是使用 std::array 而不是经典数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多