1. 程式人生 > >vector中erase用法注意事項

vector中erase用法注意事項




vector::erase():從指定容器刪除指定位置的元素或某段範圍內的元素
vector::erase()方法有兩種過載形式
如下:
iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是刪除指定位置的元素時:
返回值是一個迭代器,指向刪除元素下一個元素;
如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;


看下面的程式,目的是刪除數組裡面的所有值為6的元素:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> array;
    array.push_back(1);
    array.push_back(6);
    array.push_back(3);
    array.push_back(6);
    array.push_back(6);
    array.push_back(2);

    vector<int>::iterator itor;
    vector<int>::iterator itor2;
    for(itor=array.begin();itor!=array.end();)
    {
        if(6==*itor)
        {
           itor2=itor;
           itor=array.erase(itor2);

        }
        itor++;
    }
    itor=array.begin();
    for(itor=array.begin();itor!=array.end();)
    {
        cout<<(*itor++);
    }
    getchar();
    return 0;
}


執行結果輸出1362,可見其中一個6並未刪除,這是迭代器的問題。
原因在於erase以後,itor已經指向下一個元素了,不應該在itor++,否則會跳過下一個元素,即連續兩個6時跳過了第二個6.
另外,在itor2=itor時,兩個itor是一樣的,這樣做並無意義。可修改如下:

vector<int>::iterator itor;
// vector<int>::iterator itor2;
for(itor=array.begin();itor!=array.end();)
{
    if(6==*itor)
    {
        // itor2=itor;
        itor=array.erase(itor);
    }
    else
    {
        itor++;
    }
}


或者:

vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();itor++)
{
    if(6==*itor)
    {
        itor=array.erase(itor);
        itor--;
    }
}

也可以使用remove方法:
array.earse( remove(array.begin(), array.end(),6),  array.end() );