5

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

从 23.3.3 [2]

void erase(iterator position);

还可能值得注意的是,在我的 VS2008 附带的 STL 实现中,const_iterator当我尝试使用另一个编译器编译我的代码时,erase 会导致令人不快的惊喜。现在,由于我的版本采用 a const_iterator,因此可以使用 a 来实现擦除const_iterator(好像它不是不言而喻的)。

我想标准委员会已经考虑了一些实现(或手头现有的实现),这需要擦除来获取iterator.

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

编辑

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

4

3 回答 3

4

这是一个缺陷。从 C++11 开始,set<K,C,A>::erase需要一个const_iterator

iterator erase(const_iterator position);

2007 年的这篇论文说明了该错误并展示了避免该错误的实现。我不确定这篇论文是否是改变标准的原因,但这可能是一个很好的猜测。

于 2011-07-13T20:26:18.843 回答
0

实在想不出它需要an的任何理由iterator,所以我倾向于任意:任何修改结构的操作都需要 aniterator让用户知道以前使用的iterator可能不会在之后:

  • erase使迭代器无效。
  • insert(iter, val)更改下一个值。
  • 等等
于 2011-07-13T20:13:11.457 回答
-1

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

于 2011-07-13T20:00:42.320 回答