Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
287 views
in Technique[技术] by (71.8m points)

请教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这个指针, 所以才会发生错误?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...