当前位置:   article > 正文

【c++】vector中迭代器失效问题_c++ std::sregex_iterator无法用.begin()构造

c++ std::sregex_iterator无法用.begin()构造

通常会出现迭代器失效的情况:

(1)insert时(可能会增容),增容后会出现野指针,从而引发迭代器失效;

(2)erase时(vs报错,但linux并不一定报错),如果删的是最后一个位置,就会会出现越界的情况,也就是空间不够,从而引发迭代器失效;

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. void test_vector2()
  6. {
  7. vector<int> v;
  8. v.push_back(1);
  9. v.push_back(2);
  10. v.push_back(3);
  11. v.push_back(4);
  12. v.insert(v.begin(),0);//在当前位置的前一个进行插入
  13. v.insert(v.end(), 5);
  14. //想在某个值的前面插入一个数,这个时候得先找到这个数的位置才能进行插入
  15. //
  16. /*auto it = v.begin();
  17. while (it != v.end())
  18. {
  19. if (*it == 3)
  20. {
  21. v.insert(it, 30);
  22. break;
  23. }
  24. else
  25. {
  26. it++;
  27. }
  28. }*/
  29. //
  30. auto it = find(v.begin(),v.end(), 3);//这个接口的使用需要引<algorithm>头文件
  31. if (it != v.end())
  32. v.insert(it, 30);
  33. else
  34. cout << "没有找到" << endl;
  35. //如何删除掉3
  36. //如果不加:it = find(v.begin(), v.end(), 3)这一句的话,因为it经历了上面的insert之后,it就成了失效的迭代器
  37. //怎么理解这儿的迭代器失效呢?
  38. //迭代器失效是由insert(因为insert时可能会增容)引发的,这时候会出现野指针,也就是迭代器失效
  39. //所以,在insert之后,就不要再去访问迭代器了,因为insert之后可能会增容,从而导致迭代器失效,为了避免这个问题,我们可以重新找这个迭代器的位置,这样就不会引发迭代器失效问题了
  40. /*it = find(v.begin(), v.end(), 3);
  41. v.erase(it);*/
  42. //要求删除所给数据中所有的偶数:(这种情况下,也会导致迭代器失效,具体原因如下图分析:)
  43. it = v.begin();
  44. while (it != v.end())
  45. {
  46. if (*it % 2 == 0)
  47. v.erase(it);
  48. it++;
  49. }
  50. for (auto e : v)
  51. {
  52. cout << e << " ";
  53. }
  54. cout << endl;
  55. }
  56. int main()
  57. {
  58. /*test_vector1();*/
  59. test_vector2();
  60. system("pause");
  61. return 0;
  62. }

分析:

总之一句话,在insert之后或者erase一个迭代器之后,这个迭代器就不要再使用了,否则就会有风险。

说了这么多,我们只需记住,只要insert或者erase之后,迭代器就失效了,失效就意味着不能再去访问这个位置,否则就可能会出问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/179656
推荐阅读
相关标签
  

闽ICP备14008679号