如果在C ++中擦除()一个元素,迭代器会发生什么?

OD街

我正在尝试实现一种删除前导空格和尾随空格的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()

杰里·科芬(Jerry Coffin)

要求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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章