【发布时间】:2011-07-13 19:52:40
【问题描述】:
看来,根据 ISO 14882 2003(又名 C++ 的神圣标准)std::set<K, C, A>::erase 将 iterator 作为参数(不是 const_iterator)
从 23.3.3 [2]
void erase(iterator position);
还可能值得注意的是,在我的 VS2008 附带的 STL 实现中,erase 需要一个const_iterator,当我尝试使用另一个编译器编译我的代码时,这导致了一个令人不快的惊喜。现在,由于我的版本采用const_iterator,因此可以使用const_iterator 实现擦除(好像它不是不言自明的)。
我想标准委员会已经考虑了一些实施(或手头现有的实施),这需要擦除以获取iterator。
- 如果您同意这种情况,您能否描述
set::erase的实现,该实现需要修改将要删除的元素(我不能)。 - 如果您不同意,请告诉我他们到底为什么会做出这个决定?我的意思是,擦除元素只是重新排列指针!李>
编辑
我突然想到,即使在迭代器的情况下,您也无法修改集合中的元素。但问题仍然存在 - 为什么不是 const_iterator,尤其是如果它们在某种意义上是等价的
【问题讨论】:
-
您可能会争辩说,删除一个元素会改变元素本身(它会被删除)。我认为新的 C++0x 允许擦除常量迭代器。其他容器的情况如何?
-
@Kerrel:deleted 那就是它的析构函数被调用了。并且可以在 const 对象上调用析构函数(幸运的是:))
-
set::erase 记录
iterator,而不是const_iterator。 -
GCC 4.6.1 实现了
erase(const_iterator)。 3242 还规定了 const-iterator。 -
@Mat:这很有趣,因为我什至在 VS2008 附带的 STL 中打开了
<set>并擦除了const_iterator:)
标签: c++ stl set design-rationale