码迷,mamicode.com
首页 > 其他好文 > 详细

vector中insert/erase后指针失效问题

时间:2016-04-09 00:11:09      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

  之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。

1 小心冀冀地Erase  

  最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法

        vector<int> a;
    for (int i = 0; i < 10; ++i)
    {
        a.push_back(i);
    }
    for (auto it = a.begin(); it != a.end();++it ){
        if (*it == 5){
            a.erase(it);
        }
    }   

  没错,程序崩溃!删除了迭代器it之后,it迭代器失效了,无法再进行++it操作了。

  查了书,发现书中说it之前的迭代器是有效的。于是,机智如我:

    vector<int> a;
    for (int i = 0; i < 10; ++i)
    {
        a.push_back(i);
    }
    for (auto it = a.begin(); it != a.end();++it ){
        if (*it == 5){
            auto it1 = it;
            --it;
            a.erase(it1);
        }
    }    

  BlingBling! 机智不机智?我就问你,机智不机智?在删除5之前,我已经让it指向4了,这样,删除5之后,++it使得it指向了6,新的迭代器!

2 更加小心冀冀地Insert

  机智如我,自然会去探索一下insert之后,迭代器会怎样。于是:  

    vector<int> a;
    for (int i = 0; i < 10; ++i)
    {
        a.push_back(i);
    }

    for (auto it = a.begin(); it != a.end(); ++it){
        if (*it == 5){ 
            a.insert(it, 100);
     ++it; } }

  你猜怎么着??

  啥事儿没有!你可能会问,插入之后为什么要++it。插入之前,it指向5,在5之前插入100后,it指向100。这样下一次循环,it依然会指向5。相信我,你的程序会爆炸的!

  我作了个++it之后,it又指向5,下一次循环就直接指向5之后的元素了,顺利完成插入工作。

  世界和平~世界和平~我还真不确定。

  突然想到,当插入元素过多,vector的capacity会增加,这时会不会问题呢?说干就干:  

    vector<int> a;
    for (int i = 0; i < 13; ++i)
    {
        a.push_back(i);
    }

    for (auto it = a.begin(); it != a.end(); ++it){
        if (*it == 5){ 
            a.insert(it, 100);
     ++it;
        }
    }  

  为什么是13?因为我调试一下,VS就告诉我这个vector的capacity了。

  BOOM!果然崩溃了!也就是说插入之后的迭代器失效了。那之前的呢?

  我决定粗暴地测试一下:

    vector<int> a;
    for (int i = 0; i < 13; ++i)
    {
        a.push_back(i);
    }

    for (auto it = a.begin(); it != a.end(); ++it){
        if (*it == 5){ 
            a.insert(it, 100);
    it=a.begin();
        }
    }  

  我插入之后,直接让it指向begin(),然后单步调试。执行完it=a.begin()还好好的,可再去执行++it还是崩溃了。

  也就是说,capacity变化之后,所有的迭代器都失效了!太恐怖。我不敢下结论。

  愈发觉得有必要看看《STL源码剖析》了……

vector中insert/erase后指针失效问题

标签:

原文地址:http://www.cnblogs.com/qiaoconglovelife/p/5370396.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!