开发者社区> 问答> 正文

erase后程序执行报错,是否是由于迭代器失效,如何修改??报错

#include <string>
#include <list>
#include <iostream>
using namespace std;
void eraseStr(list<string>& slist,string str)
{ for(list<string>::iterator iter=slist.begin();iter!=slist.en();++iter)     {  
    if(*iter == str)
     {  iter = slist.erase(iter);
        --iter;   
     }
    }
}
int main()
{  
    string str;  
    list<string> slist;  
    while(cin>>str)  
        slist.push_back(str);  
    eraseStr(slist,"a");//假设上面输入存在a
} 
目的就是删除list容器中与输入字符相同的,假设输入a a a b c e a删除所有a后应该为b c e,这个函数我写完与给的答案比较,发现答案也是这么写的,可是总是执行的时候奔溃。请问该如何修改?

展开
收起
爱吃鱼的程序员 2020-06-22 22:40:24 583 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    remove(slist.begin(),slist.end(),"a");试试

    STL提供了删除的算法。

    试试

    for(list<string>::iteratoriter=slist.begin();iter!=slist.end();) 

    {

        if(*iter==str)

             iter=slist.erase(iter);

        else

             ++iter;

    }

    下面的代码有问题。

    if(*iter==str){iter=slist.erase(iter);--iter;}

    以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意遍历迭代器过程中造成迭代器失效的问题。如果你删除了一个迭代器指向的值,此时该迭代器已经失效,然后又使用该迭代器进行遍历,会造成不可预知的结果。

    erase()函数删除以pos指示位置的元素,或者删除startend之间的元素。返回值是一个 迭代器,指向最后一个被删除元素的下一个元素。

    iter=slist.erase(iter);

    09

            --iter; 

    注意在此代码之后iter不指向那个被删除的字符串了而是下一个;当你循环执行到结束的前一项时iter指向的可是空字符串所以楼主用时当心啊

    2020-06-22 22:40:42
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载