遍歷 vector 並刪除特定值(如 1)時,直接 vals.erase(itr) 會導致迭代器失效,後續遍歷崩潰。
erase() 會使被刪除元素及其後所有元素的迭代器失效。但它返回指向下一個元素的新迭代器,利用此返回值即可安全繼續遍歷。
while (itr != vals.end()) {
if (1 == *itr) vals.erase(itr); // 迭代器失效!
else ++itr;
}
while (itr != vals.end()) {
if (1 == *itr) itr = vals.erase(itr); // 接收返回的迭代器
else ++itr;
}
itr = vals.erase(itr) 統一風格。remove_if + erase(Erase-Remove 慣用語):vals.erase(remove_if(vals.begin(), vals.end(), [](int x){ return x==1; }), vals.end());ivec.erase(ivec.begin() + 3) 直接刪除指定位置。記住:erase 返回新迭代器,務必接收。這是 STL 容器修改時迭代器失效規則的典型體現。