2016-01-10 6 views
-2

У меня есть код дерева решений Java для перехода на C++. Я не очень хорошо помню логические внутренние указатели, когда пытаюсь построить дерево. Java код:Перевести Java-код на C++

public class Node { 
Node parent; 
Node children[]; 
List<Instance> instances; 
.... 
}; 

Node(Node parent, List<Instance> instances) { 
     this.parent = parent; 
     children = new Node[Instance.FTSVALUERANGE]; 
     this.instances = instances; 
     .... 
} 

Для генерации дерева:

public class ID3 { 
Node root; 
... 

public static Node generate(List<Instance> instances) { 
     Node root = new Node(null, instances); 
     expand(root, 0); 
     return root; 
    } 
static void expand(Node node, int depth) { 
      ... 
      ArrayList<ArrayList<Instance>> ts = new ArrayList<ArrayList<Instance>>(); 
      ... 
      /* Grow the tree recursively */ 
     for (int i = 0; i < Instance.FTSVALUERANGE; i++) { 
      if (ts.get(i).size() > 0) { 
       node.children[i] = new Node(node, ts.get(i)); 
       expand(node.children[i], depth + 1); 
      } 
}}} 

И вот моя с реализацией ++; Узел:

class Node 
{ 
    public: 
     Node(); 
     Node(Node* parent, std::vector<Instance>& instances); 
     Node* parent; 
     Node** children; 
     std::vector<Instance> instances; 

    .... 
}; 

Node::Node() 
{ 
    parent=NULL; 
    children=NULL; 
} 
Node::Node(Node* parent, std::vector<Instance>& instances) { 
     this->parent = parent; 
     this->children = new Node*[Instance::FTSVALUERANGE]; 
     this->instances = instances; 
     ... 
}; 

Для генерации дерева:

class ID3{ 
    Node* root; 
    static void expand(Node* node, int depth); 
    static Node* generate(vector<Instance> instances); 
    ... 
    }; 
    Node* ID3::generate(vector<Instance> instances) { 
    Node* root = new Node(NULL, instances); 
    expand(root, 0);// when use ID3.chi_square_100// there is no prunning, 
    return root; 
} 
void ID3::expand(Node* node,int depth){ 
... 
     for (int i = 0; i < Instance::FTSVALUERANGE; i++) { 
      if (ts[i].size() > 0) { 
       node->children[i] = new Node(node, ts[i]); 
       expand(node->children[i], depth + 1); 
      } 
    }}} 

Когда я пытаюсь запустить что-то не работает с детьми. Полная реализация: https://courses.cs.washington.edu/courses/cse446/12wi/ps/hw4/ID3.java
Я внес некоторые изменения для своей цели.
Спасибо заранее.
Giuseppe.

+1

Почему вы реализовать собственные структуры данных? Я предлагаю вам использовать структуры данных, уже доступные в Java и C++, или, по крайней мере, прочитать реализации, чтобы вы понимали, как они работают. Написание их с нуля, когда вы их не понимаете, будет огромной тратой времени (и ошибок). Если у вас есть ошибка в вашей программе, я предлагаю использовать ваш отладчик, чтобы найти его. –

+0

Не используйте 'NULL', вместо этого используйте' nullptr'. Не используйте указатель на указатель и используйте интеллектуальный указатель, такой как 'unique_ptr', и используйте' std :: vector' для динамических списков. –

+0

Здравствуйте, @GuillaumeRacicot, Спасибо, что помогли. Что вы подразумеваете для «Не использовать указатель на указатель и использовать интеллектуальный указатель, такой как unique_ptr»? –

ответ

0

Спасибо Guillaume Racicot за советы!
Это код:
В node.cpp:

class Node 
{ 
public: 
    Node(); 
    Node(Node* parent, std::vector<Instance>& instances); 
    Node* parent; 
    std::vector<Node*> children; 
    .... 
}; 

Node::Node(Node* parent, std::vector<Instance>& instances) { 

    this->parent = parent; 
    this->children= std::vector<Node*>(Instance::FTSVALUERANGE); 
    ... 
} 
Смежные вопросы