根据ISO 14882 2003(又名C ++的神圣标准),似乎std::set<K, C, A>::erase
将iterator
作为参数(不是const_iterator
)
来自23.3.3 [2]
void erase(iterator position);
值得注意的是,在VS2008附带的STL实现中,擦除需要const_iterator
,当我尝试用另一个编译器编译代码时,这会导致令人不快的意外。现在,由于我的版本采用const_iterator
,因此可以使用const_iterator
实现擦除(就好像它不是不证自明的一样)。
我认为标准委员会已经考虑了一些实施(或现有的实施),这需要擦除iterator
。
set::erase
的实施,这将需要修改将被删除的元素 (我不能)。 修改 的
我刚想到即使在迭代器的情况下你也无法修改集合中的元素。但问题仍然存在 - 为什么不是const_iterator, 尤其是 ,如果它们在某种意义上是等同的
答案 0 :(得分:4)
这是一个缺陷。自C ++ 11起,set<K,C,A>::erase
需要const_iterator
:
iterator erase(const_iterator position);
2007年的This论文说明了错误并显示了避免它的实现。我不确定这篇论文是否是标准变更的原因,但这可能是一个很好的猜测。
答案 1 :(得分:0)
无法真正想到需要 iterator
的任何理由,所以我倾向于任意:任何修改结构的操作都需要{{1让用户知道之前使用iterator
的内容可能不会:
iterator
使迭代器无效。erase
会更改下一个值。答案 2 :(得分:-1)
我唯一的猜测是因为insert,upper_bound,lower_bound和find正在返回迭代器(不是const迭代器)。我没有看到其他解释。