• vector删,erase和remove难怪--【STL】


    vector使用容器。通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎。

    erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个:

    如对数据1 6 6 4 7;

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        vector<int> vec;
        vec.push_back(1);
        vec.push_back(6);
        vec.push_back(6);
        vec.push_back(4);
        vec.push_back(7);
    
        vector<int>::iterator arr;
    
        //vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());
        for(arr = vec.begin(); arr != vec.end(); arr++)
        {
            if(6 == *arr)
            {
                vec.erase(arr);
                //arr--;
            }
        }
    
        cout << "The size of vector is :" << vec.size() << endl;
        for(arr = vec.begin(); arr != vec.end(); arr++)
        {
    
            cout << *arr << "  ";
        }
        cout << endl;
    
        return 0;
    }
    
    进行如上操作的结果为:


    有一个6未成功删除,因为每次循环后都将迭代器arr++,在成功删除之后节点后移了一位。实际上在删除进行时是后移了两位,故而在删除时:

    for(arr = vec.begin(); arr != vec.end(); arr++)
        {
            if(6 == *arr)
            {
                vec.erase(arr);
                arr--;
            }
        }
    有了arr--操作,就可抵消删除时的自己主动后移。从而成功进行:


    当然,erase还有另外一个方法,就是删除两个节点之间的所有元素。这时依靠remove操作将等于删除值的节点所有移到容器末尾。进行删除;

    将上述for循环删除的凝视,将其上一行的vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());凝视取消就可以实现;

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        vector<int> vec;
        vec.push_back(1);
        vec.push_back(6);
        vec.push_back(6);
        vec.push_back(4);
        vec.push_back(7);
    
        vector<int>::iterator arr;
    
        vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());  //
        /*for(arr = vec.begin(); arr != vec.end(); arr++)
        {
            if(6 == *arr)
            {
                vec.erase(arr);
                arr--;
            }
        }*/
    
        cout << "The size of vector is :" << vec.size() << endl;
        for(arr = vec.begin(); arr != vec.end(); arr++)
        {
    
            cout << *arr << "  ";
        }
        cout << endl;
    
        return 0;
    }
    

    O(∩_∩)O

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    [WC2011]最大XOR和路径 线性基
    线段树分裂合并
    [NOIp2016]天天爱跑步 线段树合并
    CF1111E Tree 树链剖分,DP
    [NOI2016]区间 线段树
    [IOI2018] werewolf 狼人 kruskal重构树,主席树
    [CQOI2012]组装 贪心
    [ONTAK2010]Peaks kruskal重构树,主席树
    [NOI2018]归程 kruskal重构树
    kruskal重构树
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4757146.html
Copyright © 2020-2023  润新知