请教c++ vector insert 问题

送外卖转行计算机
  • 12

以下是一段很简单的向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这个指针, 所以才会发生错误?

回复
阅读 1.2k
1 个回答
✓ 已被采纳

首先,vector 并不是每次插入都要重新分配内存的,随便一篇介绍 vector 的文章都有介绍,你应该先看看。

之所以造成错误的原因是因为你 insert 的时候空间正好不够,所以需要重新分配内存,进而导致迭代器失效了,也就是你所说的,是旧的。

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏