H5W3
当前位置:H5W3 > 其他技术问题 > 正文

请教c++ vector insert 问题

以下是一段很简单的向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 的时候空间正好不够,所以需要重新分配内存,进而导致迭代器失效了,也就是你所说的,是旧的。

你可以试试增加这样一条语句,

vector<int> v;
v.reserve(100); // 先分配可容纳 100 个元素的内存空间
v.push_back(1);
v.push_back(2);

reserve 的目的就是避免在 insert 的时候重新分配内存,这种策略在编程中很常见。

本文地址:H5W3 » 请教c++ vector insert 问题

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址