vector::erase 會使被刪除元素及其後所有元素的迭代器失效,並回傳指向下一個元素的有效迭代器。若在迴圈中直接 erase 且不更新迭代器,會漏刪或存取失效迭代器。
for (auto it = v.begin(); it != v.end(); ++it) {
if (*it == 6) v.erase(it); // 錯誤:it 失效,++it 未定義行為
}
// 方法一:使用 erase 回傳值
for (auto it = v.begin(); it != v.end(); ) {
if (*it == 6) it = v.erase(it);
else ++it;
}
// 方法二:逆向迭代(不需回傳值)
for (auto it = v.rbegin(); it != v.rend(); ++it) {
if (*it == 6) v.erase((it + 1).base()); // 較繁瑣
}
// 方法三:erase-remove 慣用語(刪除所有符合條件)
v.erase(remove(v.begin(), v.end(), 6), v.end());
/* test.cpp
* Created on: 2014.04.18
* Author: Spike
*/
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vi = {1, 6, 6, 3};
for (auto it = vi.begin(); it != vi.end(); ) {
if (*it == 6) it = vi.erase(it);
else ++it;
}
cout << "size: " << vi.size() << endl;
for (int x : vi) cout << x << ' ';
cout << endl;
}
size: 2
1 3