在递归函数中使用std :: vector的push_back函数时遇到问题。使用push_back之后,我的堆栈空间中的某些变量似乎已被重写。
这是我的代码:
class treap {
public:
struct t { int k, p, c, s; t *ch[2]; };
vector<t> ts;
t *h = NULL;
t **f = NULL;
t* nt() {
t a;
if (f)
cout << "1:" << (**f).k<<endl;
ts.push_back(a);
if (f)
cout << "2:" << (**f).k<<endl;
return &ts.back();
}
t* ins(t *n, int k) {
if (!n) {
t *a = nt(); a->k = k; a->p = rand();
a->c = a->s = 1; a->ch[0] = NULL; a->ch[1] = NULL;
return a;
}
f = &n;
n->ch[0] = ins(n->ch[0], k);
return n;
}
};
int main() {
treap *t = new treap();
t->h = t->nt(); t->h->k = 5; t->h->p = rand();
t->h->c = t->h->s = 1; t->h->ch[0] = t->h->ch[1] = NULL;
t->h = t->ins(t->h, 2);
delete(t); return 0;
}
我的计算机上的结果是
1:5
2:6143928
首先,我调用函数ins()访问k属性为5的节点。然后,使用指针f指向当前n。之后,我递归调用ins()。现在,当前n为NULL。所以我叫函数nt()。然后在其中声明类型为t的变量a。然后,在我调用push_back(t)之后,指向的n f点似乎已被重写。
我很困惑,我衷心希望有人能帮忙。
更新:我忘了解释为什么编写此代码。我正在尝试建立一棵树。并使用向量存储所有节点。现在,我认为错误可能是因为push_back实际上是内存的重新分配,并且此操作将更改变量的内存位置。