を使用してツリー データ構造を再実装しようとしていstd::unique_ptr
ますが、その考えは、親ノードが のベクトルに格納されている子を所有するというものですunique_ptr
。
インターフェイス上の理由から、ノードがそれ自体を破棄するメソッドが必要です。この場合、ノードは親の子ベクトルから自分自身を消去すると思います。
次の実装は (c++11 コンパイラで) 「動作」しますが、非常に見苦しく、この問題を処理する最適な方法ではないと確信しています。
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
struct Node {
typedef std::vector<std::unique_ptr<Node>> vec_node_uptr;
unsigned id;
Node* parent;
vec_node_uptr child_nodes;
// ctor
Node(unsigned id): id(id){ parent = nullptr; }
void add_child(Node* new_child){
new_child -> parent = this;
child_nodes.push_back( std::unique_ptr<Node>(std::move(new_child) ) );
}
int where_am_i(){
int result_ = 0;
for(auto& i: this -> parent -> child_nodes) {
if (this == i.get()) {
return result_;
} else {
result_++;
}
}
}
void suicide(){
parent -> child_nodes.erase(parent -> child_nodes.begin()+ where_am_i());
}
};
int main()
{
std::unique_ptr<Node> root(new Node(0));
root -> add_child(new Node(1));
root -> add_child(new Node(2));
root -> child_nodes[0] -> add_child(new Node(3));
root -> child_nodes[0] -> add_child(new Node(4));
root -> child_nodes[1] -> add_child(new Node(5));
root -> child_nodes[1] -> add_child(new Node(6));
root -> child_nodes[1] -> suicide();
return 0;
}
助言がありますか?たぶん使用std::find
?