关于vector的一些问题(5.11)

这两天,我进行到huffman编码。首先是建立huffman树。我用的是vector来存放树的节点。树的节点node包含数据(data),左孩子(lch),右孩子(rch),父亲(parent)。在创建树我用的是这个函数:
//p= Tree.begin();在构造huffman树的时候,一开始定义并赋值,之后p的位置没有变过,仅仅是用的[]取
//出其中 的内容。
//pos1,pos2是要组装的两个子节点,end是构成的父节点的位置。(这边的位置都是下标位置)
void AddNode(node *p,int pos1,int pos2,int end)
{
node n;
p[pos1].parent= end;
p[pos2].parent= end;
n.lch=pos1;
n.rch=pos2;
Tree.push_back(node); //vector<node> Tree; //定义与huffmantree类中
}
这个函数初看没有什么问题,但是当我调试的时候,发现:当我pos1=8,pos2=9的时候,执行Tree.push_back(node);之前所以数据都没有问题,但是执行这一句之后,p[pos1],p[pos2]中放的是没有初始化的数据,这时候的p[end]是没问题的。(然后,使得结束判断出错,得到了非预想的结果。)
我试了好多次,都是这个结果。后来,我估计是因为重新分配空间了。但是,重新分配空间的话,原来的数据应该拷贝到新的空间啊?别无他法,有就试着把 p 换成了 Tree(p[pos1]->Tree[pos1])。然后其他地方做了相应的修改,发现取得了预想的效果。
那么,到底哪里出现问题了呢??我分析了一下。首先,肯定是vector重新分配空间了,在那个过程中出错了。有对比了一下先后的代码,发现把 p 换成 Tree之后,就没问题了。那么,就是 p 的指向的地方有问题。
想了一下 p 指向的地方:p= Tree.begin(); 对了,空间重新分配后, Tree.begin()变了,而 p 还是指向原来的地方——已经释放掉的地方,所以数据就没有初始化了。而给用Tree之后,Tree在重新分配空间之后,也随之换了。接下来,一切都对了。。。 3.gif
函数但中传指针出了问题,那么怎么预防呢? 24.gif
大家都可以来讨论一下。
我觉得,要么,就不要传递指针,直接传递vector;要么,就不要让指针所指向的内容在函数执行过程发生变化,比如说push_back(x);
暂时想到这么多。 2.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值