vector::erase 會使原迭代器失效,但返回指向下一個元素的新迭代器。必須接收返回值,否則後續遍歷會崩潰。
for (auto it = v.begin(); it != v.end(); ) {
if (*it == 1) it = v.erase(it); // 關鍵:接收返回值
else ++it;
}
v.erase(v.begin() + 3); (隨機訪問迭代器支持算術)v.erase(remove_if(v.begin(), v.end(), [](int x){ return x==1; }), v.end());erase(iterator),迭代器可由 find 或索引獲得。| 操作 | 失效範圍 |
|---|---|
| erase(pos) | pos 及其後所有迭代器 |
| insert(pos, ...) | 若觸發重新分配,所有迭代器;否則 pos 及其後 |
| push_back | 若觸發重新分配,所有迭代器 |
| resize/reserve | 若容量增大,所有迭代器 |
牢記 erase 返回新迭代器,配合 for(; it!=end; ) 循環結構,即可安全刪除。現代 C++ 應優先考慮 remove_if + erase 組合,代碼更簡潔高效。