今天在OJ上刷题,偷懒就用了vector容器,然后用了erase,结果运行时出错了。。。。。无奈,查了下erase的用法。

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);

Return value:An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence.--CPLUSPLUS.COM

对于vector和string,指向被删除元素之前元素的迭代器,引用和指针仍然有效。
注意:当我们删除元素时,尾后迭代器总是会失效。——<<C++ Primer 5thd>>

erase会返回当前位置的下一个位置的指针,被删除元素之前的迭代器,指针,引用仍然有效,但是尾后迭代器是会失效的。

我之前的代码类似如下:

for(vector<int>::iterator it = v.begin();it!= v.end(); it++)
{
    if(*it == num)
    {
        v.erase(it);
    }
}

由于erase后,end()尾指针失效了,所以再次执行时就会报错咯。

应该改成如下:

for(vector<int>::iterator it = v.begin();it!= v.end();)
{
    if(*it == num)
    {
        it = v.erase(it);
    }
    else
    {
        it++;
    }
}
最后修改:2019 年 03 月 06 日
如果觉得我的文章对你有用,请随意赞赏