在bst中插入rvalue

时间:2018-03-29 21:48:17

标签: c++ stl move rvalue-reference allocator

我试图为BST写一个类似STL的容器。我有两个不同的函数来插入左值和右值。使用rvalue的函数会覆盖以前插入的所有值。

以下是代码:

 std::pair<iterator, bool> insert( value_type&& value ) {
    return insert_unique( std::move( value ) );
}

template<typename Vp_> std::pair<iterator, bool> insert_unique( Vp_&& value ) {
    node_holder_ h_             = make_node_holder( std::move( value ) );
    node_pointer_ root_         = ( *header_ ).parent_;
    node_pointer_ inserted_node = h_.release();

    if ( root_ == nullptr ) {
        ( *header_ ).parent_   = inserted_node;
        ( *header_ ).left_     = inserted_node;
        ( *header_ ).right_    = inserted_node;
        inserted_node->parent_ = header_;
        size_++;
        return std::make_pair( make_iterator( inserted_node ), true );
    }

    node_pointer_ parent = root_;
    node_pointer_ x      = root_;

   while ( x != nullptr ) {
        parent = x;
        if ( compare_( inserted_node->key_, x->key_ ) )
            x = x->left_;
        else if ( compare_( x->key_, inserted_node->key_ ) )
            x = x->right_;
        else
            return std::make_pair( make_iterator( x ), false );
    }

    if ( compare_( inserted_node->key_, parent->key_ ) )
        parent->left_ = inserted_node;

    else
        parent->right_ = inserted_node;
    inserted_node->parent_ = parent;
    // Update leftmost and right most
    if ( compare_( inserted_node->key_, leftmost()->key_ ) ) ( *header_ ).left_ = inserted_node;
    if ( !( compare_( inserted_node->key_, rightmost()->key_ ) ) &&
         !( compare_( rightmost()->key_, inserted_node->key_ ) ) ) {
        ( *header_ ).right_   = inserted_node;
        inserted_node->right_ = header_;
    }

    size_++;
    return std::make_pair( make_iterator( inserted_node ), true );
}

node_holder_ make_node_holder( value_type&& value ) {
    // std::cout << "args holders " << std::endl;
    node_allocator_& na_ = get_allocator();
    node_holder_ nh_( na_.allocate( 1 ), node_destructor_( na_ ) );
    node_traits_::construct( na_, nh_.get(), std::move( value ) );
    nh_.get_deleter().value_constructed_ = true;
    return std::move( nh_ );
}

我提到了Scott-Meyers的talk,并使用std :: move级联了rvalue。但是,代码中存在一些导致覆盖的错误。如果能够识别导致此问题的错误,请分享一下吗?

Code repository。 bst.h类位于lib /目录中。

如果您对代码有任何其他意见和反馈,请分享。

0 个答案:

没有答案