c++ - vector 删除迭代器

标签 c++ vector iterator

我有这个代码:

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;
    }
}

“一个随机访问迭代器,指向函数调用删除的最后一个元素之后的元素的新位置,如果操作删除了序列中的最后一个元素,则该位置是 vector 结束。”

此代码崩溃,但如果我使用 if(it == res.end()) 部分然后返回,它可以工作。怎么来的? for 循环是否缓存了 res.end() 以使不等于运算符失败?

最佳答案

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

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

只是检查 .end() 仍然会留下一个错误,因为您总是在每次迭代时跳过一个元素(it 通过从 .erase(),然后再循环一次)

你可能想要这样的东西:

 while (it != res.end()) {
        it = res.erase(it);    
 }

删除每个元素

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

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

for ( ; it != res.end(); ) {
  if (condition) {
    it = res.erase(it);
  } else {
    ++it;
  }
}

关于c++ - vector 删除迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4645705/

相关文章:

c++ - 命名空间内的类友元函数

r - 如何在不使用索引的情况下提取向量元素

c++ - 寻找子树的空间复杂度

java - 将 CPP 应用程序移植到 Android

gnuplot 上带有 u 和 v 分量的向量场

c++ - 我需要帮助将数组添加到 C++ 中的 vector

loops - 展开向量中的(开始,结束)对

c++ - 将作为参数传入的对象数组转换为 vector

c++ - 获取 c 数组上 begin 的返回类型

c++ - 字符串指针语法,这是正确的吗?