std::vector::erase函数在删除元素后会返回一个指向被删除元素之后第一个有效元素的迭代器。你应该使用这个返回的迭代器来继续遍历或操作容器。 3. 示例代码 以下是一个示例代码,展示了如何在删除std::vector中的一个元素后,正确处理其后的迭代器: cpp #include <iostream> #include <vector> int...
当你用erase以迭代器方式删除vector中的元素时,vector会自动将被删除元素后边的元素往上挪一位,所以此时指向删除元素的迭代器指向了被删除元素后面的元素,所以在循环中,此时迭代器就不应该加1了,大概像下面这种写法 for(itE = listE.begin(); itE !=listE.end();) {//取出一条边ActivityEdge* currE = *itE...
iterator erase(iterator first, iterator last);// 删除[first,last)对应的元素,也即first对应元素被删除,last对应的元素不被删除,并返回最后一个被删除元素的下一个元素位置, //对本函数也即为迭代器last。 //注意:删除元素后,删除点之后的元素对应的迭代器不再有效。 (一)iterator erase(iterator first, ite...
3.使用erase(const_iterator position)删除元素后,指向被删除元素的迭代器position将会失效(后文会提到),注意迭代器不是元素地址,虽然同样可以通过解引用操作符*访问元素。 先说正确写法,erase之后重新给it赋值: for (vector<int>::iterator it = vec.begin(); it != vec.end();) { if (*it == 4) { ...
前言:vector我们经常使用,对vector里面的基本函数构造函数、增加函数、删除函数、遍历函数我们也会用到。其中在使用遍历之后erase删除元素过程中,会出现一种删除最后一个元素破坏了迭代器的情况。 如下所示 删…
没有重新分配。但是后续的元素被往前移动,因此被删除的元素之后的迭代器会失效。例如,下面的代码在debug模式下将会崩溃,在release模式下正常运行而且可以看到数组的地址并没有改变。include <vector>#include <iostream>int main(){ std::vector<int> v{ 1, 2, 3, 4, 5, 6, 7 }; auto...
看很多文章说如下写法(erase相关)会导致迭代器失效,但是测试验证发现并没失效,而且也符合预期;这是为什么呢? vector<int> tmp; for (int i = 1; i <= 10; i ++) { tmp.push_back(i); } for (auto iter = tmp.begin(); iter != tmp.end(); iter++) { if (*iter == 5) { tmp.erase(it...
综上所述,`std::vector::erase`导致迭代器失效的原理在于容器内部元素的重新布局和迭代器的生命周期管理。为了预防此类问题,应避免在循环中直接删除元素,或者确保在删除元素后更新迭代器,或者使用常量迭代器以避免访问被删除元素的位置。同时,尽量避免在循环结束后使用迭代器访问元素,以防止潜在的程序...
vector迭代器遍历: vector迭代器遍历时erase删除元素 erase函数会将迭代器指针iter变为野指针,此时若继续执行++iter,会导致iter指向未知位置,...