首页 > 代码库 > vector中的删除,earse和remove的小疑惑--【STL】

vector中的删除,earse和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

vector中的删除,earse和remove的小疑惑--【STL】