vector::erase函数是C++标准库中的一个成员函数,用于从vector容器中删除指定位置的元素。然而,如果在使用vector::erase函数时出现崩溃的情况,可能是由于以下几个原因导致的: 迭代器失效:vector::erase函数接受一个迭代器作为参数,指示要删除的元素位置。当调用erase函数后,被删除元素之后的所有元素会向前移动,导致之前...
insert和erase导致的迭代器失效 在未扩容的情况下,虽然vector的内存是不变的,但依照C++标准,插入和删除位置之后的迭代器是应该失效的. 在Debug模式下,VC++会使用更加严格的检测规则,对传入的迭代器进行处理和监测,但Release模式下是不会对迭代器做过多检测和判断的; 代码语言:javascript 复制 intmain(){vector<int...
erase删除pos位置元素后,pos位置之后的元素会往前移动,没有导致底层空间的改变,理论上讲迭代器不会失效,但是如果pos位置刚好是最后一个元素,删完之后pos刚好是end的位置,而end的位置是没有有效元素的,那么pos就失效了。因此删除vector中任意位置元素时,vs均认为该位置上迭代器失效了!也就是说vector删除一定会导致迭代...
std::vector<int> vec = {1,2,3,4,5}; auto iter = vec.begin(); auto end = vec.end(); for(; iter != end; ++iter) { if (*iter == 3) erase(iter); } vec的size已经是4了,但是这样还是会访问到第五个,虽然内存是分配给vec了 [1,2,4,5,未使用] 原来的vec[2] vec[3] vec...
迭代器失效:迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间 🌞删除时失效 erase也会造成迭代器失效代码示例:(删除) void test_vector() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); ...
insert和erase导致的迭代器失效 在未扩容的情况下,虽然vector的内存是不变的,但依照C++标准,插入和删除位置之后的迭代器是应该失效的. 在Debug模式下,VC++会使用更加严格的检测规则,对传入的迭代器进行处理和监测,但Release模式下是不会对迭代器做过多检测和判断的; ...
看很多文章说如下写法(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...
迭代器失效的情况: 1、重新分配内存 当向vector添加新元素导致其容量不足时,vector会自动扩展以容纳更多的元素。这种情况下,所有指向旧内存区域的迭代器、指针和引用都会失效。 复制 #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3}; ...
这便导致了迭代器失效。 第二种:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。 这里我们主要讨论下第二种情况。 我们先举个例子说明: 比如vector中存储了1,2,3,4,5,6,7,8,9,10 假如此时迭代器指向6. 当我们erase这个迭代器的元素后,vecotr被删除元素后面的元素会依次前...
一、迭代器失效 主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装。比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会...