C++中stl模版中的erase()和end()(和我之前提的问题不一样)

来源:百度知道 编辑:UC知道 时间:2024/06/04 07:33:25
我有一个以结构体为元素的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(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 !=

用一个很笨的方法可保证安全,因为迭代器不是在任何时候都有效!

如下
1.添加一个判断函数:

bool IsExistIter(iter& itCompare, list<HFdata>& h)
{
bool bIsExist = false;
for (iter _this_is_temp = h.begin(); _this_is_temp != h.end(); ++_this_is_temp)
{
if ( _this_is_temp == itCompare )
{
return true;
break;
}
}

return false;
}
2.安全地,有保护地erase()
// 保障temp_list_1是有效的

if ( IsExistIter(temp_list_1, h))
{
temp_list_1 = h.erase(temp_list_1);
}
else
{
temp_list_1 = h.begin();
}

// 保障temp_list_2是有效的

if ( IsExistIter(temp_list_2, h))
{
temp_list_1 = h.erase(temp_list_1);
}
else
{
temp_list_1 = h.begin();
}