矢量擦除迭代器

hid*_*yat 66 c++ iterator vector

我有这个代码:

int main()
{
    vector<int> res;
    res.push_back(1);
    vector<int>::iterator it = res.begin();
    for( ; it != res.end(); it++)
    {
        it = res.erase(it);
        //if(it == res.end())
        //  return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

"一个随机访问迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则为向量结束."

此代码崩溃,但如果我使用if(it == res.end())然后返回它的工作原理.怎么会?for循环是否兑现了res.end(),因此不相等的运算符失败了?

Pie*_*ter 142

res.erase(it) 如果擦除它指向的最后一个元素,则总是返回下一个有效的迭代器 .end()

在循环结束时++it总是被调用,所以你增加.end()不允许的.

简单地检查.end()仍然会留下一个错误,因为你总是在每次迭代时跳过一个元素(通过循环it返回'递增' .erase(),然后再循环)

你可能想要这样的东西:

 while (it != res.end()) {
        it = res.erase(it);    
 }
Run Code Online (Sandbox Code Playgroud)

擦除每个元素

(为了完整性:我假设这是一个简化的例子,如果你只是希望每个元素都不用去执行操作(例如删除),你应该简单地调用res.clear())

当你只是有条件地擦除元素时,你可能想要类似的东西

for ( ; it != res.end(); ) {
  if (condition) {
    it = res.erase(it);
  } else {
    ++it;
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 28

for( ; it != res.end();)
{
    it = res.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

或者,更一般的:

for( ; it != res.end();)
{
    if (smth)
        it = res.erase(it);
    else
        ++it;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`while`? (3认同)