如题。
做了好多测试,发现在使用reserve手动给vector容器分配大小后,原来容器的迭代器,引用全部都没有失效
这我就不明白了,在使用insert时,导致内存重新分配时,迭代器会失效,而是用reserve却没有。
源码看的一脸懵逼,求教大神
https://blog.csdn.net/wangshubo1989/article/details/50334297
vector<int> a = { 1,2,3 };
a.reserve(10);
vector<int>::iterator it = a.begin();
a.reserve(1000);
cout << (*it) << endl;
it++;
cout << *it << endl;
测试这段代码,使用reserve之后,原来的迭代器失效了,看第二个reserve
首先,vector是可以像vector a={1,2,3}这样赋值的,运行起来也没有问题
另外,我测试的时候,使用reserve之后迭代器是失效了的
reserve(count)会在当前capacity小于count并且max_size大于count的时候重新为vector分配空间
我猜你遇到的使用reserve之后迭代器没有失效,是在capacity很大,reserve的大小小于capacity的情况发生的
reserve
1.分配新的内存块,它有容器目前容量的倍数。在大部分实现中,vector和string的容量每次以2为因数增长。也就是说,当容器必须扩展时,它们的2.容量每次翻倍。
3.把所有元素从容器的旧内存拷贝到它的新内存。
4.销毁旧内存中的对象。
5.回收旧内存。
所有指向vector或string中的迭代器、指针和引用**都会失效**。这意味着简单地把一个元素插入vector或string的动作需要更新其他使用了指向vector或string中的迭代器、指针或引用的数据结构。
所以 ,**应该不存在从新分配后,迭代器的引用仍生效的情况**。