以下是一段很简单的向vector中插值的代码
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
// v.insert(v.begin(), 3);
vector<int>::iterator it = v.begin();
v.insert(v.begin(), 3);
while (it != v.end()) {
cout << *it << endl;
++it;
}
return 0;
}
请问为什么这样是错误的, 把v.insert(v.begin(), 3);
加到注释那里就是正确的?
我的猜测是vector每次新增元素的时候其实是去找了一块新的内存地址, 而it
是在新增元素之前取的, 它是一个指向旧地址头部的指针, 所以在vecotr insert之后就会变成一个野指针, 然而后面的逻辑操作仍然是在用it
这个指针, 所以才会发生错误?
首先,vector 并不是每次插入都要重新分配内存的,随便一篇介绍 vector 的文章都有介绍,你应该先看看。
之所以造成错误的原因是因为你 insert 的时候空间正好不够,所以需要重新分配内存,进而导致迭代器失效了,也就是你所说的,是旧的。
你可以试试增加这样一条语句,
reserve 的目的就是避免在 insert 的时候重新分配内存,这种策略在编程中很常见。