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(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

还望不吝赐教!!!谢谢

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

如下
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();
}

// temp_list_2被删除后,还要再次保障temp_list_1是有效的

if ( !IsExistIter(temp_list_1, h))
{
temp_list_1 = h.begin();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-20
你应该是研究生吧,研究stl了,应该是高手了。c++高级部分我不熟悉,刚刚才起步,以后还请指教。先记住你了。

C++中stl模版中的erase()和end()(和我之前提的问题不一样)
用一个很笨的方法可保证安全,因为迭代器不是在任何时候都有效!如下 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...

C++ STL中erase函数的用法 求助~~
对于vector一般不要用erase(),因为很多情况下他要和<algorithm>中的remove()一块用!erase()的使用会使迭代器失效如果删除的不是最后面的元素的话。你的程序中if(*iter%2==0) ivec.erase(iter); 可以换成:(记着加头文件<algorithm>)if (*iter%2 == 0)ivec.erase(remove(ivec.begin(...

c++stl里面的map.erase(...)
你不会是在循环里用erase吧。这样的原先的迭代器就失效了。你说的delete是什么?同时erase是返回下一个迭代器。因为要用 map stl for(it = stl.begin(); it != stl.end()){ if(),,it = stl.erase(it );else it ++ \/\/ 或者用 st.erase(it++)} ...

C++中STL各种移除元素方法
大多数STL容器移除元素都可以用erase()方法。这种方法有两种形式:erase(iterator position)erase(iterator first, iterator end)分别删除一个或一组元素。此方法适用于vector, deque, list, map, multimap, multiset, set。此外,map, multimap, set和multiset还有一个 erase(const key_type& key)用于删...

c++ 里面的erase()和insert()的问题。
set 容器可以根据想被插入的值来求得它应该放的位置, 因为它是个二叉树。但是list vector 里面的元素是无序的, 所以容器不知道被插数值的插入位置,故必须用迭代器确定插入位置。reference: http:\/\/www.cplusplus.com\/reference\/stl\/

C++ STL 中 remove 和 erase 的区别
remove是逻辑上的删除,实际所在容器分配的内存大小没改变,只是把删除的元素移到了容器的最后并且重置end指向的位置。如果你知道容器末尾的指针的话,即使某元素remove了也查得到。erase是物理上的删除,容器大小被改变,相当于把元素所占用的那一小点内存给格式化了。

C++ STL 中 remove 和 erase 的区别
C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢?vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size list容器中的remove 成员函数,原型是void ...

c++ STL map 中erase()后++会指向那个元素?以及erase后map将会自动做什...
map的erase()有三个重载函数,你说的是哪个? 如果是根据key值来删除,成功返回1,失败返回0.如果根据迭代器删除单个,迭代器要后++,因为删除了的迭代器会失效,所以要指向下一个。如果是根据迭代器删除一片的话,要重新指定迭代器。

求C++中 string系列库函数:如reverse(s.begin(),s.end());\/\/倒置...
比较字符串s1和字符串s2,忽略大小写,最多比较maxlen个字符。返回值是s1与s2第一个不同的字符差值。char *strnset (char *s, int ch, size_t n);设置字符串s中的前n个字符全为字符c。返回指针为s的值。char *strset (char *s, int ch);设置字符串s中的字符全为字符c。返回指针为s的...

C++使用STL模板时为什么会有list iterator not dereferencable 这个...
没问题啊。我运行过了:貌似你的输出语句不对,应该是cout << "删除的第" <<t->loc << "个 : " << i << endl;

相似回答
大家正在搜