读书人

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

发布时间: 2012-05-15 14:35:29 作者: rapoo

[求助]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/ 供参考

读书人网 >C++

热点推荐