1. 程式人生 > >vector中的刪除,erase和remove的小疑惑--【STL】

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