He usado std::vector<std::shared_ptr<Node> > children
con éxito en una situación similar.
La principal ventaja de utilizar un vector de shared_ptrs en lugar de una matriz es que se maneja toda la administración de recursos para usted. Esto es especialmente útil en dos situaciones:
1) Cuando el vector ya no está en el alcance, automáticamente llama a eliminar en todos sus contenidos. En este caso, el recuento de referencia del nodo secundario se reducirá en 1 y si nada más hace referencia a él, se invocará eliminar en el objeto.
2) Si hace referencia al Nodo en otro lugar, no hay riesgo de quedarse con un puntero colgando a un objeto eliminado. El objeto solo se eliminará cuando ya no haya más referencias al mismo.
A menos que desee un comportamiento que sea sustancialmente más complicado (quizás haya una razón por la cual una matriz es necesaria), le sugiero que este podría ser un buen enfoque para usted.
Una simple aplicación de la idea:
class Node {
private:
T contents;
std::vector<std::shared_ptr<Node> > children;
public:
Node(T value) : contents(value) {};
void add_child(T value) {
auto p = std::make_shared<Node>(value);
children.push_back(p);
}
std::shared_ptr<Node> get_child(size_t index) {
// Returning a shared pointer ensures the node isn't deleted
// while it is still in use.
return children.at(index);
}
void remove_child(size_t index) {
// The whole branch will be destroyed automatically.
// If part of the tree is still needed (eg. for undo), the
// shared pointer will ensure it is not destroyed.
children.erase(children.begin() + index);
}
};
auto_ptr está en desuso en C++ 11 y se debe evitar si es posible en el código en la versión más antigua C++ también. – Nikko
'auto_ptr' está en desuso porque es innecesariamente difícil de usar correctamente. Utilice 'unique_ptr' en su lugar, que es básicamente lo mismo que' auto_ptr', solo que funciona correctamente y también admite matrices. Está disponible desde C++ 11. – nwp
también eche un vistazo a http://stackoverflow.com/questions/3987521/how-bad-is-to-use-void-pointer-in-stdvector-declaration – fizzbuzz