根据 C++ 规范(23.2.4.3),vector::erase() 仅使“擦除点之后的所有迭代器和引用”无效
因此,当使用 reverse_iterators 传递所有向量成员时,当前迭代器上的擦除不应导致rend() 成员无效。
此代码将在 G++ 下运行,但会在 Windows (VS2010) 上提供运行时异常:
#include <vector>
using namespace std;
int main()
{
vector<int> x;
x.push_back(1);
x.push_back(2);
x.push_back(3);
//Print
for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
printf("%d\n", *i);
//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend(); ++r)
if(*r == 2)
x.erase((r+1).base());
//Print
for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
printf("%d\n", *i);
return 0;
}
这个错误很有趣:
表达式:向量迭代器不可递减
在第二次运行时在第二个 for 循环的行上给出。减量指的是 reverse_iterator 的内部“当前”迭代器成员,每当 reverse_iterator 增加时,它就会减少。
任何人都可以解释这种行为吗?
谢谢。
编辑
我认为这个代码示例更好地表明这不是 r 的问题,而是 rend() 的问题:
//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend();)
{
vector<int>::reverse_iterator temp = r++;
if(*temp == 2)
x.erase((temp+1).base());
}
vector iterators incompatible
并在擦除后进入 for 循环时出错。