zoukankan      html  css  js  c++  java
  • vector迭代器失效的几种情况

    在泛型编程还是STL的实际运用中,迭代器(iterator)无疑扮演者重要的角色。迭代器是一种类似于指针的对象(如可以内容提领,成员访问等),但他又不仅仅是一种普通的指针。关于迭代器失效,我们可以看下面这个例子:

    #include<vector>
    #include<list>
    void PrintVector(const vector<int>& v)
    {
        vector<int>::const_iterator it = v.begin();
        while (it!=v.end())
        {
            cout << *it << " ";
            it++;
        }
        cout << endl;
    }
    void TestIterator()
    {
            //迭代器失效
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(2);
    v.push_back(4);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    v.push_back(4);
    v.push_back(4);
    v.push_back(6);
        vector<int>::iterator it = v.begin();
        while (it != v.end())
        {
            if (*it % 2 == 0)
            {
                it = v.erase(it);
                ++it;
            }
            
        }
        PrintVector(v);
    }
    void main()
    {
        TestIterator();
    }
    这样的代码乍一看好像没有什么问题,但是他是有问题的,因为在vector是顺序存储的,在vector中删除一个元素之后,我们需要为vector重新分配一个空间,存放在旧的空间的元素被复制到新的空间,如果删除的这个元素的迭代器会指向下一个元素之后还++it,则在复制的时候找不到下一个元素,因此会使删除点及删除点之后的迭代器失效。正确做法是:

    vector<int>::iterator it = v.begin();
        while (it != v.end())
        {
            if (*it % 2 == 0)
            {
                it = v.erase(it);
            }
            else
            {
                ++it;
            }
            
        }
        PrintVector(v);

    对于添加元素也是同理,如果当前容器中有10个元素,现在又要添加元素到容器中,如果内存中没有多余的空间,因此vector需要重新开辟空间来存储原来的元素以及新添加的元素。在新的空间复制原理来的元素,并插入新的元素,最后撤销原来的空间,这种情况发生会使所有迭代器都失效。

    总结:vector迭代器的几种失效的情况:

    1.当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。

    2.当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操 作返回的迭代器都会失效。

    3.当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。

  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5874572.html
Copyright © 2011-2022 走看看