三、迭代器失效
(1)在v中插入元素1,2,3,4,5后,在3前面插入30
1. vector<int> v; 2. 3. //插入6个int元素 4. v.push_back(1); 5. v.push_back(2); 6. v.push_back(3); 7. v.push_back(4); 8. v.push_back(5); 9. 10. //在3的前面插入30 11. vector<int>::iterator pos = find(v.begin(), v.end(), 3);//查找3的位置 12. if (pos != v.end()) 13. { 14. v.insert(pos, 30); 15. } 16. PrintVector(v);
但是当删除30时,执行如下代码,程序崩了
1. v.erase(pos); 2. PrintVector(v);
这是因为先查找3,找到后挪动3的位置及之后的数据,插入30,3已经挪走了,但pos还指向原来的位置,也就是现在30的位置。再erase的时候,pos失效了,因为pos的意义变了,不再指向3了,所以程序崩溃。
(2)如下代码当删除所有偶数时,程序会崩
1. vector<int> v; 2. v.push_back(1); 3. v.push_back(2); 4. v.push_back(3); 5. v.push_back(4); 6. v.push_back(5); 7. v.push_back(6); 8. 9. //删除v中所有的偶数 10. vector<int>::iterator it = v.begin(); 11. while (it != v.end()) 12. { 13. if (*it % 2 == 0) 14. { 15. v.erase(it); 16. } 17. it++; 18. } 19. 20. PrintVector(v);
执行过程:end不固定,删除数据后,每次都会去重新拿取,end是最后一个数的下一个位置
而且执行过程中,由于删除数据后,it++了,迭代器的意义变了,所以结果一定不正确。
迭代器失效有两种情况:
(1)pos意义变了,插入数据以后,pos不再指向3,而是指向30,导致erase(pos)没有达到删除3的目的,反而删除的是30
(2)程序可能崩溃,pos变成了野指针
在使用迭代器之前,对迭代器重新赋值
对于(1)使用迭代器之前,对迭代器重新赋值
1. vector<int> v; 2. 3. //插入6个int元素 4. v.push_back(1); 5. v.push_back(2); 6. v.push_back(3); 7. v.push_back(4); 8. v.push_back(5); 9. 10. //在3的前面插入30 11. vector<int>::iterator pos = find(v.begin(), v.end(), 3); 12. if (pos != v.end()) 13. { 14. v.insert(pos, 30); 15. } 16. 17. PrintVector(v); 18. 19. //使用迭代器之前,对迭代器重新赋值 20. pos = find(v.begin(), v.end(), 3); 21. //然后再使用迭代器 22. if (pos != v.end()) 23. { 24. v.erase(pos); 25. } 26. PrintVector(v);
对于(2)每次使用迭代器之前,对迭代器重新赋值,当it为偶数的位置时,删除偶数后,it不用++
1. vector<int> v; 2. v.push_back(1); 3. v.push_back(2); 4. v.push_back(3); 5. v.push_back(4); 6. v.push_back(5); 7. v.push_back(6); 8. 9. //删除v中所有的偶数 10. vector<int>::iterator it = v.begin(); 11. while (it != v.end()) 12. { 13. if (*it % 2 == 0) 14. { 15. //每次使用迭代器之前,对迭代器重新赋值 16. it = v.erase(it);//删除偶数后,it不用++ 17. } 18. else 19. { 20. it++;//奇数,it++ 21. } 22. 23. } 24. 25. PrintVector(v);