2013-12-11 37 views
1

我有一个procudere删除我的树堆,并上线p=merge(l, merge(m, rs));我有错误error: non-const lvalue reference to type 'nodeptr' (aka 'node *') cannot bind to a temporary of type 'nodeptr' 因此,这里是执行的删除和合并错误删除树堆

nodeptr treap::merge(nodeptr &l, nodeptr &r){ 
    nodeptr result; 
    if (!l){ 
     result=r; 
    } 
    else if(!r){ 
     result=l; 
    } 
    else if(l->cnt > r->cnt){ 
     l->right=merge(l->right, r); 
     result=l; 
    } 
    else{ 
     r->left=merge(l, r->left); 
     result=r; 
    } 
    return result; 
} 

void treap::deletes(nodeptr &p, int x){ 
    nodeptr l, r, m, rs; 
    split(p, x-1, l, r); 
    split(r, x, m, rs); 
    if (m){ 
     if (!m->left){ 
      m=m->right; 
     } 
     else{ 
      m=m->left; 
     } 
    } 
    p=merge(l, merge(m, rs)); 
} 

,我该如何实现树堆的数据结构。

typedef struct node *nodeptr; 
struct node{ 
    int x; 
    long y; 
    node* left ; 
    node* right ; 
    int cnt; 
    node(int key=0, long prior=0): x(key), y(prior), left(NULL), right(NULL), cnt(0) {} 
}; 

class treap{ 
public: 
    int cnt(nodeptr &p); 
    bool find(nodeptr &p, int x); 
    void update_cnt(nodeptr &p); 
    void split(nodeptr &p, int x, nodeptr &l, nodeptr &r); 
    void insert(nodeptr &p, nodeptr &q); 
    nodeptr merge(nodeptr &l, nodeptr &r); 
    void deletes(nodeptr &p, int x); 
}; 

你能说我,为什么会有这个错误?我认为一切都很好。对不起,如果问题是不好意思的话。提前致谢。

+1

嗯,错误很明显:你不能将非const引用绑定到临时对象。该声明的问题究竟在哪里? – PlasmaHH

+1

'treap :: merge'函数返回'nodeptr'类型的临时对象。这个对象不能传递给'merge'函数,因为它需要l值引用'nodeptr&'。 – Constructor

回答

1

你已经对指针的引用感到烦恼。当您说p=merge(...)时,编译器正试图将merge返回的临时文件nodeptr分配给参考。但是,然后温度超出范围,p不再具有有效的参考。可悲的是,有时你需要使用指针。

+0

这里不需要指针。我们可以简单地将返回类型改为'nodeptr&',在'treap :: merge'函数中将'result = smth;'替换为'return smth;'并删除局部变量'result'。 – Constructor

+0

的确如此,但是指针 - >引用 - >指针的嵌套在某些时候通常会变得混乱。更好地使用引用,如果他们有意义。参考文献在这里保存的唯一东西是有时会加上一个额外的星号。 –