Arm*_*yan 5 c++ stl set design-rationale
看来,根据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
当我尝试用另一个编译器编译我的代码时,擦除会导致令人不快的意外.现在,由于我的版本采用了a const_iterator
,因此可以用a实现擦除const_iterator
(就好像它不是不言而喻的).
我认为标准委员会考虑了一些实现(或者现有的实现),这需要擦除才能获得iterator
.
set::erase
其中需要修改将要删除的元素(我不能).编辑
我刚想到即使在迭代器的情况下你也无法修改集合中的元素.但问题仍然存在 - 为什么不是const_iterator,特别是如果它们在某种意义上是等同的
这是一个缺陷。从 C++11 开始,set<K,C,A>::erase
采用const_iterator
:
iterator erase(const_iterator position);
Run Code Online (Sandbox Code Playgroud)
2007 年的这篇论文阐述了该错误并展示了避免该错误的实现方法。我不确定这篇论文是否是标准更改的原因,但这可能是一个不错的猜测。