我正在尝试使用 重新实现树数据结构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
?