Nel*_*eal 6 c++ iterator stl erase c++11
C++11 更改std::vector::erase为采用 aconst_iterator而不是iterator. 同样的事情也适用于std::dequeand std::list,而std::forward_listC++11 中的 witherase_after也采用const_iterator.
相比之下,std::set::erase保留了它的iterator重载,而 C++11 只是添加了一个const_iterator。同样的事情也适用于所有关联容器:std::map、std::multiset和std::multimapall 保留了 C++11 之前的iterator重载std::unordered_set,std::unordered_map而 、std::unordered_multiset、 和std::unordered_multimapall 则通过iterator和const_iterator重载引入。
事实上,对于所有四个集合类,iterator和const_iterator很可能是同一类型。
那么为什么会出现这种差异呢?除了与非关联容器不一致之外,还与范围擦除重载不一致,这些重载都在 C++11 中更改为采用一对const_iterators 而不是一对iterators。由于 aniterator必须可转换为 a const_iterator,因此无需将所有四种可能的参数组合用于范围擦除。同样,单值擦除不需要“所有两种组合”,那么为什么要保留重载呢iterator?
最初在 C++11 中,旧的iterator重载被const_iterator所有这些容器的重载所取代。
然而,关联容器始终具有erase采用键类型作为参数的额外重载。诸如此类的序列容器std::vector没有此类额外的重载。
因此,如果您添加const_iterator重载并删除iterator重载,并且iterator和const_iterator不是同一类型,那么重载解析就有可能变得不明确,而在 C++11 之前则不然,例如,如果键类型具有来自的构造函数iterator。
因此, LWG 问题 2059的解决方案将旧的iterator重载作为缺陷报告添加回来。对于使用 C++11 添加的无序关联容器,它们可能以相同的方式添加,以便两种容器之间不存在不必要的接口差异。