首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

[]C++中stl模版中的erase()和end()

2012-05-15 
[求助]C++中stl模版中的erase()和end()我有一个以结构体为元素的list做形参的函数,与构建哈夫曼树有关,代

[求助]C++中stl模版中的erase()和end()
我有一个以结构体为元素的list做形参的函数,与构建哈夫曼树有关,代码如下,问题写在了对应行的注释里:
typedef struct HFtree_Data_point 
{
 char data;
 double weight;
 bool l_code;
 bool r_code;
 struct HFtree_Data_point *lchild;
 struct HFtree_Data_point *rchild;
 struct HFtree_Data_point *parent;
} HFdata; 

void Creat_HFtree(int n,HFdata**HFtree,list<HFdata> &h) //构建哈夫曼树
{
 if ( !h.empty() )
  h.clear(); //不为空则清空
 for (int i = 0;i != n;i++) {
  HFdata temp;
  cout << "请输入字符:";
  cin >> temp.data;
  cout << "请输入该结点权重:";
  cin >> temp.weight;
  h.push_back(temp);
 } //依次进入链表
 Creat(HFtree,h); // 创建过程
}

void Creat(HFdata**HFtree,list<HFdata> h) //构建哈夫曼树核心部分
{
 typedef list<HFdata>::iterator iter;
 *HFtree = (HFdata*)malloc(sizeof(HFdata));

 while(h.size() != 1) { 
  HFdata *temp = (HFdata*)malloc(sizeof(HFdata));
   
  HFdata *lchild = (HFdata*)malloc(sizeof(HFdata)); 
  iter temp_list_1 = h.begin();
  iter it_1 = h.begin();
  
  while(it_1 != h.end()) { //查找左孩子
  it_1++;
  if((temp_list_1 -> weight) > (it_1 ->weight))
  temp_list_1 = it_1;
  }

  *lchild = *temp_list_1;
  h.erase(temp_list_1); 
/*问题:此循环正常执行,但是似乎影响了下一个循环*/

  HFdata *rchild = (HFdata*)malloc(sizeof(HFdata));
  iter temp_list_2 = h.begin();
  iter it_2 = h.begin();

  while(it_2 != h.end()) { //查找右孩子
  it_2++;
  if((temp_list_2 -> weight) > (it_2 ->weight))
  temp_list_2 = it_2;
  }
  *rchild = *temp_list_2;
  h.erase(temp_list_2);
/*问题:此循环不能停止,迭代器it_2自增之后,到了某一值,it_2就突然变小,好像是转到list的头了*/
  
  lchild -> parent = temp; //构建
  rchild -> parent = temp;
  temp -> lchild = lchild;
  temp -> rchild = rchild;
  temp -> l_code = 0;
  temp -> r_code = 1;
  h.push_back(*temp);
 }

 (*HFtree) -> data = h.front().data; //赋值
 (*HFtree) -> weight = h.front().weight;
 (*HFtree) -> lchild = h.front().lchild;
 (*HFtree) -> rchild = h.front().rchild;
 (*HFtree) -> l_code = h.front().l_code;
 (*HFtree) -> r_code = h.front().r_code;
 (*HFtree) -> parent = h.front().parent;
}//end
后来我更改了此函数(还是Creat函数),代码如下,依然存在问题:
void Creat(HFdata**HFtree,list<HFdata> h) //构建哈夫曼树核心部分
{
 typedef list<HFdata>::iterator iter;
 *HFtree = (HFdata*)malloc(sizeof(HFdata));

 while(h.size() != 1) { 
  HFdata *temp = (HFdata*)malloc(sizeof(HFdata));
   
  HFdata *lchild = (HFdata*)malloc(sizeof(HFdata)); 
  HFdata *rchild = (HFdata*)malloc(sizeof(HFdata));
  iter temp_list_1 = h.begin();
  iter it = h.begin();
  
  while(it != h.end()) { //查找左孩子
  it++;
  if((temp_list_1 -> weight) > (it ->weight))
  temp_list_1 = it;
  }


  iter temp_list_2 = h.begin();
  it = h.begin();

  while(it != h.end()) { //查找右孩子
  it++;
  if((temp_list_2 -> weight) > (it ->weight) && temp_list_2 != temp_list_1 )
  temp_list_2 = it;
  }
  
  *lchild = *temp_list_1;
  *rchild = *temp_list_2;
  temp_list_1 = h.erase(temp_list_1);
/*问题:前两个循环正常结束,但是到了此句程序就不能继续执行了,不知道是为什么*/


  temp_list_2 = h.erase(temp_list_2);
  
  
  lchild -> parent = temp; //构建
  rchild -> parent = temp;
  temp -> lchild = lchild;
  temp -> rchild = rchild;
  temp -> l_code = 0;
  temp -> r_code = 1;
  h.push_back(*temp);
 }

 (*HFtree) -> data = h.front().data; //赋值
 (*HFtree) -> weight = h.front().weight;
 (*HFtree) -> lchild = h.front().lchild;
 (*HFtree) -> rchild = h.front().rchild;
 (*HFtree) -> l_code = h.front().l_code;
 (*HFtree) -> r_code = h.front().r_code;
 (*HFtree) -> parent = h.front().parent;
}//end

还望不吝赐教!!!谢谢



[解决办法]
erase操作成功的话,是会返回其所删除迭代器的下一位的,temp_list_2 = h.erase(temp_list_2);
有些时候,如果涉及到起点或者重点,那就是重新使用begin()或者end(),在循环判断过程中,尽量
直接使用begin()和end()
[解决办法]
推迟更新;到你真正需要用的时候才给其明确赋值;
[解决办法]
曾经写过静态 huffman 树作业 http://blog.chinaunix.net/u3/94090/ 供参考

热点排行