#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,这个函数我写完与给的答案比较,发现答案也是这么写的,可是总是执行的时候奔溃。请问该如何修改?
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指示位置的元素,或者删除start和end之间的元素。返回值是一个 迭代器,指向最后一个被删除元素的下一个元素。
iter=slist.erase(iter);
09 | --iter; 注意在此代码之后iter不指向那个被删除的字符串了而是下一个;当你循环执行到结束的前一项时iter指向的可是空字符串所以楼主用时当心啊 |
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。