C++ STL remove和erase的區別及使用

remove是一個函數,頭文件是algorithm;

erase是每個容器的成員函數。

 

在介紹之前先介紹v.begin()和v.end():

v.begin()指的是第一個元素;

v.end()值得最後一個元素的下一個位置;

vector<int>::iterator it;

it=remove(v.begin(),v.end(),4);//刪除值爲4的元素。每刪除一個,後面的往前賦值覆蓋移動

//返回值爲刪除完的vector的下一個無效元素。

//迭代器可以繼續往後訪問

//刪除操作結束,v.size()不變。也就是說其實後面的元素沒有完全刪除。

例外情況:list中的成員函數list.remove是真的刪除,類似接下來介紹的erase。

v.erase(v.begin(),v.end());//完全刪除所有元素;

v.erase(pos);//刪除某一個元素,返回值爲下一個元素的地址。

for(it=v.begin(); it!=v.end(); it++){

    if( *iter == 3)

    v.erase(it);

}
//本段代碼本意是刪除vector中值爲3的元素,但是代碼錯誤。erase把 it刪除了,it成爲野指針,所以出錯。

for(it=v.begin(); it!=v.end(); it++)  

{  

      if( *it == 3) {

             it = v.erase(it);  
      }
}//無法刪除連續的2個3

for(it=v.begin(); it!=v.end(); )  

{  

      if( *it == 3)  {

             it = v.erase(it);  
      } else {

              ++it;
      }

}

remove和erase聯合使用:

v.erase(remove(v.begin(),v.end(),3),v.end);

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