【问题标题】:tree data structure with list in c++C++中带有列表的树数据结构
【发布时间】:2018-07-03 23:17:16
【问题描述】:

我用c++实现了一个树形结构,参考了别人的代码。我制作的下面的代码肯定是编译过的,并且看起来运行良好。但我怀疑有更好的方法。例如,这段代码在内存泄漏点上是否安全?有没有更简单、计算效率更高的方法?

具体来说,我怀疑“std::list lst_nodes”的必要性。 Tree 类中的 expand_node 函数将一个新节点附加到一个父节点,其值最接近新节点的值。此过程需要遍历所有现有节点以访问它们的值。为了这个迭代目的,我在 Tree 类中定义了一个名为“std::list lst_nodes”的成员变量。而且我怀疑可能存在一种无需定义 lst_nodes 的巧妙方法。

#include<random>
#include<iostream>
#include<list>
using namespace std;

class Node{
  public:/*functions*/
    Node(const double& val_, Node* parent_=nullptr)
      :val(val_), parent(parent_)
    {
      if(parent){
        parent->children.push_back(this);
      }
    }
  public:/*variables*/
    Node* parent;
    std::list<Node*> children;
    double val;
};

class Tree{
  public:/*function*/
    Tree(double x_init);
    void extend_node();

  public:/*variables*/
    list<Node*> lst_nodes;
    double x_init;
};

Tree::Tree(double x_init_)
  :x_init(x_init_)
{
  Node* n=new Node(x_init);
  lst_nodes.push_back(n);
}

void Tree::extend_node(){
  double val_new = rand();
  auto it=lst_nodes.begin();
  double minval = abs((**it).val-val_new);
  Node* node_parent;
  for(;it!=lst_nodes.end(); it++){
    if(minval>abs((**it).val-val_new)){
      minval = abs((**it).val-val_new);
      node_parent = *it;
    }
  }
  Node* n_new = new Node(val_new, node_parent);
  node_parent->children.push_back(n_new);
  lst_nodes.push_back(n_new);
}

int main(){
  Tree t(0);
  for(int i=0; i<100; i++){
    t.extend_node();
  }
}

非常感谢。

【问题讨论】:

  • 您也可以在Code Review Stack Exchange 上发帖
  • @Richard:您的链接未按预期显示,因为您省略了“https://”
  • 这段代码在内存泄漏时安全吗? -- 没有一次调用delete,因此代码充满了内存泄漏。
  • @Beta 已修复,谢谢
  • 你是对的,lst_nodes 不应该在那里。您正在创建节点列表和树。而是将其设为搜索树,以便您可以通过这种方式定位节点。

标签: c++ list tree self-reference


【解决方案1】:

在现代 C++ 中,当指向的对象归拥有该指针的对象所有时,您可以使用 unique_pointer&lt;T&gt; 而不是原始的 T* 指针。这样,您不必显式地 delete 对象,它将在 unique_ptr 析构函数中完成。

在一棵树(即其中没有环的连通图)中,所有权被明确定义:每个节点都拥有它的子节点,因此您可以使用list&lt;unique_ptr&lt;Node&gt;&gt; 代替Node::children

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多