赞
踩
通常会出现迭代器失效的情况:
(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;
(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;
- #include <iostream>
- #include <vector>
- #include <algorithm>
-
- using namespace std;
-
- void test_vector2()
- {
- vector<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
-
- v.insert(v.begin(),0);//在当前位置的前一个进行插入
- v.insert(v.end(), 5);
-
- //想在某个值的前面插入一个数,这个时候得先找到这个数的位置才能进行插入
- //①
- /*auto it = v.begin();
- while (it != v.end())
- {
- if (*it == 3)
- {
- v.insert(it, 30);
- break;
- }
- else
- {
- it++;
- }
- }*/
- //②
- auto it = find(v.begin(),v.end(), 3);//这个接口的使用需要引<algorithm>头文件
- if (it != v.end())
- v.insert(it, 30);
- else
- cout << "没有找到" << endl;
-
- //如何删除掉3?
- //如果不加:it = find(v.begin(), v.end(), 3)这一句的话,因为it经历了上面的insert之后,it就成了失效的迭代器
- //怎么理解这儿的迭代器失效呢?
- //迭代器失效是由insert(因为insert时可能会增容)引发的,这时候会出现野指针,也就是迭代器失效
- //所以,在insert之后,就不要再去访问迭代器了,因为insert之后可能会增容,从而导致迭代器失效,为了避免这个问题,我们可以重新找这个迭代器的位置,这样就不会引发迭代器失效问题了
- /*it = find(v.begin(), v.end(), 3);
- v.erase(it);*/
-
- //要求删除所给数据中所有的偶数:(这种情况下,也会导致迭代器失效,具体原因如下图分析:)
- it = v.begin();
- while (it != v.end())
- {
- if (*it % 2 == 0)
- v.erase(it);
- it++;
- }
-
- for (auto e : v)
- {
- cout << e << " ";
- }
- cout << endl;
- }
-
- int main()
- {
- /*test_vector1();*/
- test_vector2();
- system("pause");
- return 0;
- }

分析:
总之一句话,在insert之后或者erase一个迭代器之后,这个迭代器就不要再使用了,否则就会有风险。
说了这么多,我们只需记住,只要insert或者erase之后,迭代器就失效了,失效就意味着不能再去访问这个位置,否则就可能会出问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。