我需要实现一个具有可变数量节点的通用树结构。我想通过相对于结构而不是内存的密钥来寻址节点。 预期用途是:
...
Tree<int> t ;
auto r = t.set_root(4) ; // set 4 as root, r is a key to acces the created node
auto a = t.append(r,5,2) ; // append 5 as 2nd child of r, a is the key of the created node
Tree<int> v = t ;
v.append(a,4,1) // set 4 as 1st child of node indexed by a in v, t is not modified
...
我从以下结构开始实现这个:
template< typename T >
struct Node {
Node(T dat):mData(dat),mChilds(0,std::shared_ptr<Node<T>>()) {}
Node(Node const& n):mData(n.mData),mChilds(n.mChilds.size(),std::shared_ptr<Node<T>>()) {
for ( int i = 0 ; i < mChilds.size() ; i++ ) {
if( n.mChilds[i] ) {
mChilds[i].reset(new Node<T>(*(n.mChilds[i]))) ;
}
}
}
~Node() { }
T mData ;
std::vector< std::shared_ptr<Node<T>> > mChilds ;
Node<T>& operator=(Node<T> t) {
std::swap(t.mData,this->mData);
std::swap(t.mChilds,this->mChilds);
return *this ;
}
};
template< typename T >
struct Tree {
Tree ():mRoot() {}
Tree ( Tree<T> const& t) :mRoot() {
mRoot.reset(new Node_t(*(t.mRoot)));
}
std::shared_ptr<Node<T>> mRoot ;
Tree<T>& operator=(Tree<T> t) {
std::swap(t.mRoot,this->mRoot);
return *this ;
}
};
我实际使用:
typedef std::vector<int> key_t ;
作为访问节点的密钥,我存储了要跟踪的路径以访问我的数据。这很有效但我担心内存中的大小如果节点很深就会占用密钥。
有没有人对这把钥匙有更好的想法?或者对于整个结构,但是因为我需要切割兄弟姐妹,在树木之间交换等等。我认为链接结构是最好的......
我知道有一些libs lihe Tree.hh或BGL适合但我不能使用外部库
答复的答案