我正在尝试实现一种删除前导空格和尾随空格的C ++方法
string::iterator begin = s.begin();
string::iterator end = s.end()-1;
while (*begin == ' ') {
cout << "*begin is: " << *begin << endl;
begin++;
}
while (*end == ' ') {
cout << "*end is: " << *end << endl;
end--;
}
s.erase(s.begin(),begin);
s.erase(end+1,s.end());
然后我的代码已崩溃。经过几次调试后,我发现当我erase()
从字符串中获取元素时,它实际上是导致我的某种“迭代器位置错误”(我把这个名字改了起来……不知道这个错误究竟是什么意思……)。因此,如果我改为执行此操作(更改过程):
string::iterator begin = s.begin();
while (*begin == ' ') {
cout << "*begin is: " << *begin << endl;
begin++;
}
s.erase(s.begin(),begin);
string::iterator end = s.end()-1;
while (*end == ' ') {
cout << "*end is: " << *end << endl;
end--;
}
s.erase(end+1,s.end());
没有更多的问题了:D
因此,我真的很想知道当您erase()
从迭代器中获取元素时,迭代器到底发生了什么。例如,如果您erase()
首先/最后两个元素,那么s.end()
/将会发生什么s.begin()
?
要求std::string
如下:(§[string.require] / 4):
引用basic_string序列的元素的引用,指针和迭代器可能会由于以下basic_string对象的使用而无效:
[...]
—调用非常量成员函数,但operator []除外,位于front,back,开始,开始,结束和撕裂。
我只用substr
,像这样:
s = s.substr(begin, end-begin);
我可能还会使用字符串的成员函数来进行搜索:
auto begin = s.find_first_not_of(' ');
auto end = s.find_last_not_of(' ');
s = s.substr(begin, end-begin);
由于它可以在单个操作中完成工作,因此可以避免迭代器失效的任何问题(而且,这样做可能会更快一些)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句