这不会编译,因为 container::iterator 和 container::const_iterator 是两种不同的类型,唯一(一个参数)版本的擦除是:iterator erase(iterator);
不接受const_iterator 可以被视为语言标准中的缺陷:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2350.pdf
这种限制没有特别的原因。迭代器仅用于在(可修改的)容器中指示位置,在insert 或erase 的情况下都不是被修改的迭代器的“指针”(在@987654328 的情况下) @ 它只是在概念上不复存在,这对于 const 对象来说是很正常的事情)。
当前标准表明“迭代器常量和容器常量”之间存在混淆(此处的其他答案也是如此),并且似乎 const_iterator 在 C++0x 中可能会被 erase 接受。
作为一种解决方法,您可以从const_iterator 有效地获取iterator,因为容器首先必须是可变的。
下面的函数只能为随机访问迭代器编译,因为它可能对其他类型的迭代器来说太慢了。
#include <vector>
template <class Container>
typename Container::iterator to_mutable_iterator(Container& c, typename Container::const_iterator it)
{
return c.begin() + (it - c.begin());
}
int main()
{
int arr[] = {1, 5, 2, 5, 3, 4, 5, 1};
std::vector<int> vec(arr, arr + sizeof(arr) / sizeof(*arr));
for (std::vector<int>::const_iterator it = vec.begin(); it != vec.end(); ) {
//if (*it = 5) { //const_iterator prevents this error
if (*it == 5) {
it = vec.erase(to_mutable_iterator(vec, it));
}
else {
++it;
}
}
}
但是,重组代码可能会更好,这样一开始就不需要const_iterator。在这种情况下,最好使用std::remove 算法。如果您需要在擦除之前做更多非变异工作,您可以将其提取到单独的方法等中。