在stl中vector容器使用中,有时要在for循环中删除多个元素。
如下使用示例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vi = {1, 2, 2, 4, 4, 4, 10, 3, 4, 4, 4};
cout << "Erase before >>>" << endl;
for (auto x : vi) {
cout << x << endl;
}
for (auto it = vi.begin(); it != vi.end();) {
if (*it == 4) {
it = vi.erase(it);
} else {
++it;
}
}
cout << "Erase after >>>" << endl;
for (auto x : vi) {
cout << x << endl;
}
return 0;
}
在erase方法删除指定位置的元素,然后返回下一个元素的迭代器。
以下是vector erase方法的源码(加了注释)
iterator erase(iterator position)
{
if (position + 1 != end()) // 如果<删除元素>之后还有 其他元素
copy(position + 1, finish, position); // 把<删除元素>之后的其他元素依次向前移动
--finish;
destroy(finish);
return position; // 返回下一元素迭代器,其实之后元素往前移动了,迭代器指针位置没有变
// 所以迭代的指向了新的元素
}
NOTE: 如果<删除元素>之后没有元素了,position就直接指向end().