vector中erase用法注意事項
阿新 • • 發佈:2018-12-27
也可以使用remove方法:
array.earse( remove(array.begin(), array.end(),6), array.end() );
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() );