vector迭代器失效场景

来源:互联网 发布:怎么在知乎发帖 编辑:程序博客网 时间:2024/05/04 10:54

vector迭代器失效场景

    1. push_back(vlaue) 操作导致vector发生内存重分配,所有迭代器失效(不是必然)。
vector<int> vec = { 1, 2, 3, 4 };//size:4 capacity:4auto iter = vec.begin();vec.push_back(5);   //size:5 capacity:8cout << *iter << endl;//迭代器已经失效,运行错误
    1. insert(iterator, value) 操作导致vector发生内存重分配,所有迭代器失效(不是必然)。
vector<int> vec(5,0);//size:5 capacity:5auto temp = ++vec.begin();vec.insert(vec.begin(), 4);//size:6 capacity:10cout << *temp << endl;//迭代器已经失效,运行错误
    1. erase(iterator)erase(begin,end) 操作会导致指向删除点及其后元素的迭代器全部失效。
vector<int> vec(5,0);//size:5 capacity:5auto temp = vec.begin();vec.erase(vec.begin());//size:4 capacity:5cout << *temp << endl;//迭代器已经失效,运行错误

那么如何防止发生此类错误呢?

程序中如果有`push_back()`,`insert(iterator, value)`,`erase(iterator)`操作,之后必须用vector.being()操作重新获得迭代器

vector vs 普通数组

在C++中一般强烈推荐使用vector而不是普通的数组。普通的数组存在下面一些问题:

  • 1) 没有检查下标是否出界。(请注意,有些容器类, 如std::vector ,含有不检查下标的元素访问方法。)
  • 2) 数组通常要求从堆中分配内存(见下文的例子),在这种情况下你必须确定手动分配内存最终被删除(即使例外被抛出的情况下)。当你使用容器类,内存管理是自动处理的,但是当你使用数组的时候,你必须手动编写大量代码(不幸的是,通常需要一些技巧)。例如,除了编写代码来析构所有的对象和delete内存之外,对于数组你通常还需要添加额外的try和catch块来析构所有对象和delete内存,然后再重新引发异常。这是个真正的苦差事,如这里所示。当使用容器类, 事情将会更简单。
  • 3) 不能插入元素到数组中间,甚至添加到数组的末尾,除非你是通过堆分配的数组,即使如此,你必须分配一个新的数组和复制所有的元素。
  • 4) 容器类给可以传递引用或值,但数组不能:数组总是通过引用传递。如果你想模拟数组的值传递,你必须手动编写代码来明确复制数组元素(可能从堆中分配),以及编写代码来清理数组的拷贝。如果使用容器类,这一切都是自动处理。
  • 5) 如果你的函数有一个非静态局部数组(即“auto”数组),那么你不能返回该数组。但是如果是容器类对象,那么情况将不是这样。

使用vector可以避免上述问题,同时可以大大提高开发效率。

0 0