C++ vector使用erase()刪除元素時的注意事項

在使用erase()刪除元素時,如果不清楚該函數實現原理,可能會造成莫名的bug,

正常情況下使用for循環查找vector中元素是否滿足條件時一般會用錯誤演示中的代碼,但這種情況可能會導致段錯誤,原因在於,如果it當前爲最後一個元素的迭代器,那麼將會返回無效地址,此時將執行it++;正是這條語句導致的地址非法即段錯誤,因此要解決該問題,那麼就需要將it回退到n-1處的地址,或者修改for循環,目的就是防止訪問無效地址。

int a[3] = {1,2,3};
vector<int> v(a,a+3);
//錯誤演示
for(vector<int>::iterator it =v.begin();v != v.end();it++)
{
    if(*it ==2)
    {
        it = v.erase(it);//表示將當前迭代器的下一個迭代器賦給it,否則it將爲野指針
    }
}
//方案一

    if(*it ==2)
    {
        it = v.erase(it);//表示將當前迭代器的下一個迭代器賦給it,否則it將爲野指針
        it--;
    }
//方案二
for(vector<int>::iterator it =v.begin();v != v.end();)
{
    if(*it ==2)
    {
        it = v.erase(it);//表示將當前迭代器的下一個迭代器賦給it,否則it將爲野指針
    }
    else
        it++;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章