为什么std :: set <k,c,=“”a =“”> :: erase需要一个const_iterator?</k,>

时间:2011-07-13 19:52:41

标签: c++ stl set design-rationale

根据ISO 14882 2003(又名C ++的神圣标准),似乎std::set<K, C, A>::eraseiterator作为参数(不是const_iterator

  

来自23.3.3 [2]

     

void erase(iterator position);

值得注意的是,在VS2008附带的STL实现中,擦除需要const_iterator,当我尝试用另一个编译器编译代码时,这会导致令人不快的意外。现在,由于我的版本采用const_iterator,因此可以使用const_iterator实现擦除(就好像它不是不证自明的一样)。

我认为标准委员会已经考虑了一些实施(或现有的实施),这需要擦除iterator

  • 如果您同意这种情况, 可以请您描述set::erase的实施,这将需要修改将被删除的元素 (我不能)。
  • 如果你不同意,请告诉我 为什么他们会在地球上做出这个决定? 我的意思是,删除一个元素只是一些重新排列的指针!

修改

我刚想到即使在迭代器的情况下你也无法修改集合中的元素。但问题仍然存在 - 为什么不是const_iterator, 尤其是 ,如果它们在某种意义上是等同的

3 个答案:

答案 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)

我唯一的猜测是因为insertupper_boundlower_boundfind正在返回迭代器(不是const迭代器)。我没有看到其他解释。