C++ Primer 习题9.35:
使用迭代器寻找和删除string对象中所有的大写字母。
给出的答案如下:
#include <iostream> #include <string> #include <cctype> using namespace std; int main() { string str("This is an example"); for(string::iterator iter=str.begin();iter!=str.end();++iter) { if(isupper(*iter))//元素为大写字母 { iter=str.erase(iter);//删除该元素 --iter;//使迭代器指向被删元素的前一元素 } } cout<<str<<endl; return 0; }
结果运行时出现错误,经检查问题出在13行(--iter)这一句。它的原意是使迭代器指向被删元素的前一元素,然后再经过for循环里的(++iter)语句是迭代器指向下一个元素。本意是不错,可是它忽略了一个事实,如果被删的元素是第一个元素,再让迭代器指向被删元素的前一元素就超出了容器的范围。不幸的是,字符串“This is an example”第