Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c+中带列表的树数据结构+; 我在C++中实现了一个树形结构,参照了别人的代码。下面我编写的代码肯定是经过编译的,而且似乎工作得很好。但我怀疑还有更好的方法。例如,这段代码在内存泄漏时是否安全?有没有更简单、计算效率更高的方法_C++_List_Tree_Self Reference - Fatal编程技术网

c+中带列表的树数据结构+; 我在C++中实现了一个树形结构,参照了别人的代码。下面我编写的代码肯定是经过编译的,而且似乎工作得很好。但我怀疑还有更好的方法。例如,这段代码在内存泄漏时是否安全?有没有更简单、计算效率更高的方法

c+中带列表的树数据结构+; 我在C++中实现了一个树形结构,参照了别人的代码。下面我编写的代码肯定是经过编译的,而且似乎工作得很好。但我怀疑还有更好的方法。例如,这段代码在内存泄漏时是否安全?有没有更简单、计算效率更高的方法,c++,list,tree,self-reference,C++,List,Tree,Self Reference,具体来说,我怀疑“std::list lst_节点”的必要性。 树类中的expand_node函数将新节点附加到父节点,该父节点的值与新节点的值最接近。此过程需要对所有现有节点进行迭代以访问其值。为了这个迭代,我在树类中定义了一个名为“std::list lst_nodes”的成员变量。我怀疑可能存在一种不定义lst_节点也能做到这一点的简洁方法 #include<random> #include<iostream> #include<list> using

具体来说,我怀疑“std::list lst_节点”的必要性。 树类中的expand_node函数将新节点附加到父节点,该父节点的值与新节点的值最接近。此过程需要对所有现有节点进行迭代以访问其值。为了这个迭代,我在树类中定义了一个名为“std::list lst_nodes”的成员变量。我怀疑可能存在一种不定义lst_节点也能做到这一点的简洁方法

#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();
  }
}
#包括
#包括
#包括
使用名称空间std;
类节点{
公共:/*功能*/
节点(const double&val,节点*父节点=nullptr)
:val(val_)、父(parent_)
{
如果(家长){
父->子对象。向后推(此);
}
}
公共:/*变量*/
节点*父节点;
性病:列出儿童;
双val;
};
类树{
公共:/*功能*/
树(双x_init);
void extend_node();
公共:/*变量*/
列出lst_节点;
双x_初始;
};
Tree::Tree(双x_init_)
:x_init(x_init)
{
Node*n=新节点(x_init);
lst_节点。向后推_(n);
}
void树::扩展_节点(){
double val_new=rand();
auto it=lst_节点。begin();
双最小值=绝对值(**it.val-val_新);
节点*节点\父节点;
对于(;it!=lst_nodes.end();it++){
如果(minval>abs((**it.val-val\u new)){
minval=abs(**it.val-val_新);
node_parent=*it;
}
}
Node*n_new=新节点(val_new,Node_parent);
节点\u父节点->子节点。推回(n\u新建);
lst_节点。将_向后推(n_新建);
}
int main(){
树t(0);

在现代C++中,(int i=0;i,可以使用<代码> UNQuyJORION 而不是原始的<代码> T*< /Cord>指针,当指向的对象是拥有指针的对象所拥有的。这样,您就不必明了<代码>删除<代码>对象,它将在<代码> UNQuyGyPTR < /C>析构函数> < /P>
在树(即一个没有圈的连通图)中,所有权是明确定义的:每个节点都拥有它的子节点,因此您可以使用
列表
作为
节点::子节点

您可以在as上发布well@Richard:您的链接未按预期显示,因为您忽略了“https://”这段代码在内存泄漏的情况下安全吗?--没有一个调用
delete
,因此代码充满了内存泄漏。@Beta fixed Thanks您是正确的,lst_节点不应该在那里。您正在创建一个节点列表和一个树。相反,将其设置为搜索树,以便您可以通过这种方式定位节点。