关于string:iterator的有关问题
关于string::iterator的问题




编译老是出现这样的问题,求解??
------解决思路----------------------
erase是有返回值的,不要轻易忽略函数的返回值
------解决思路----------------------
额,这个应该是运行错误吧,不是编译错误
在遍历时,当删除一个元素时,此时迭代器it指向的单元被移除,该单元后面的元素就会往前移,如果此时再对其进行it++操作就会导致it跳过后面一个元素。所以,当你删除最后一个元素,it此时本来已经等于end(),而再执行it++,就跳过了end(),这样就可一直循环下去,程序崩溃。
改法,如5楼
------解决思路----------------------
erase之后,后面的数据位置改变,导致原迭代器失效,此时it++失败。应改为:
编译老是出现这样的问题,求解??
------解决思路----------------------
erase是有返回值的,不要轻易忽略函数的返回值
for (string::iterator it = str.begin(); it != str.end();)
{
if (isupper(*it))
{
it = str.erase(it);
}
else
{
++it;
}
}
------解决思路----------------------
额,这个应该是运行错误吧,不是编译错误
在遍历时,当删除一个元素时,此时迭代器it指向的单元被移除,该单元后面的元素就会往前移,如果此时再对其进行it++操作就会导致it跳过后面一个元素。所以,当你删除最后一个元素,it此时本来已经等于end(),而再执行it++,就跳过了end(),这样就可一直循环下去,程序崩溃。
改法,如5楼
------解决思路----------------------
erase之后,后面的数据位置改变,导致原迭代器失效,此时it++失败。应改为:
for(auto it = str.begin(); it!=str.end();){当然,这一题不适用迭代器也行,可以直接用remove_if函数:
if(isupper(*it))
it = str.erase(it);
else
it++;
}
str.erase(remove_if(str.begin(), str.end(), isupper), str.end());