在使用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++;
}