在對vector中的元素進行遍歷刪除時遇到了一點問題,查博客發現博客上並不靠譜。在此記錄,共同進步。
vector循環遍歷正確代碼:
for(vector<int>::iterator it=vec.begin(); it!=vec.end();){
if(*it == 3){
vec.erase(it);
}else{
it ++;
}
}
或者:
for(vector<int>::iterator it=vec.begin(); it!=vec.end();){
if(*it == 3){
it = vec.erase(it);
}else{
it ++;
}
}
推薦使用第二種。因爲vector::erase()的實質是將迭代器後面的元素全部複製一遍,往前移動一個位置,可以查看erase()的源代碼是:
_M_erase(iterator __position)
{
if (__position + 1 != end())
std::copy(__position + 1, end(), __position);
--this->_M_impl._M_finish;
return __position;
}
所以如果遇到erase(it + 1)這種情況使用第一種方案會出錯,使用第二種不會。
另外,我查別人的博客時發現有人說不能使用如下代碼(下面這個代碼是錯的):
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == 3)
veci.erase(iter);
}
是因爲會使it變成野指針,其實並不是這個原因。這段代碼之所以錯是因爲假如有兩個連續的元素需要刪除會漏刪一個、假如被刪除的元素是vector的最後一個元素會出現野指針。