访问树结构c ++的最佳方法

时间:2014-04-24 02:40:39

标签: c++ templates c++11 containers

我需要实现一个具有可变数量节点的通用树结构。我想通过相对于结构而不是内存的密钥来寻址节点。 预期用途是:

...
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适合但我不能使用外部库

答复的答案

0 个答案:

没有答案