现在的位置: 首页 > 综合 > 正文

关于vector的一些问题(5.11)

2014年09月05日 ⁄ 综合 ⁄ 共 1044字 ⁄ 字号 评论关闭
  这两天,我进行到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在重新分配空间之后,也随之换了。接下来,一切都对了。。。
 函数但中传指针出了问题,那么怎么预防呢?
 大家都可以来讨论一下。
 我觉得,要么,就不要传递指针,直接传递vector;要么,就不要让指针所指向的内容在函数执行过程发生变化,比如说push_back(x);
 暂时想到这么多。

抱歉!评论已关闭.