vector 中 erase 用法注意事項
阿新 • • 發佈:2019-01-02
vector::erase():從指定容器刪除指定位置的元素或某段範圍內的元素
vector::erase()方法有兩種過載形式
如下:
iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);
如果是刪除指定位置的元素時:
返回值是一個迭代器,指向刪除元素下一個元素;
如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;
看下面的程式,目的是刪除數組裡面的所有值為6的元素:
- #include<iostream>
-
#include<vector>
- usingnamespace 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;
- 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;
- array.erase(itor);
- }
- else
- {
- itor++;
- }
- }
或者:
- vector<int>::iterator itor;
- for(itor=array.begin();itor!=array.end();itor++)
- {
- if(6==*itor)
- {
- array.erase(itor);
- itor--;
- }
- }
也可以使用remove方法:
array.earse( remove(array.begin(), array.end(),6), array.end() );