當使用迭代器遍歷容器并刪除元素時,迭代器可能會失效。
對于vector來說,如果使用普通迭代器(例如std::vector<int>::iterator)進行遍歷和刪除操作,當你刪除一個元素后,后面的元素會向前移動填補空缺,導致當前迭代器指向的位置已經不再有效。此時繼續使用該迭代器將產生未定義行為。
對于map來說,使用普通迭代器或者逆向迭代器進行遍歷并刪除操作同樣存在迭代器失效的問題。因為在刪除某個鍵值對后,其他鍵值對的位置可能發生變化,導致當前迭代器無法正確指向下一個要訪問的元素。
解決這個問題的一種常見方式是使用"erase-remove"慣用法。即通過調用容器提供的成員函數 erase() 來移除需要刪除的元素,并保持正確的迭代器位置。例如,在vector中可以使用 erase-remove idiom:
vec.erase(std::remove(vec.begin(), vec.end(), value), vec.end());
而在map中可以配合使用返回下一個有效迭代器的 erase() 成員函數:
for (auto it = map.begin(); it != map.end(); )
{
if (condition)
it = map.erase(it);
else
++it;
}
注意:C++11 引入了范圍循環 for-each,但不適用于在迭代過程中刪除元素的情況,因為它使用的是臨時迭代器并不允許修改容器