12

参见,例如, http ://en.cppreference.com/w/cpp/container/map/erase

在 C++03 中有三个重载:

void erase( iterator pos );
void erase( iterator first, iterator last );
size_type erase( const key_type& key );

在 C++11 中,第一个和第二个重载被更改为 takeconst_iterator以便可以使用iterator或调用它们const_iterator。第一个重载也得到了改进,它在删除迭代器后将迭代器返回到元素:

iterator erase( const_iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );

在 C++17 中,重新引入了非常量重载:

iterator erase( const_iterator pos );
iterator erase( iterator pos );
void erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );

为什么需要这个?没有为 ranged eraseinsert、 或任何序列容器(例如vectordeque和 )添加它list

4

1 回答 1

15

这样做是为了解决LWG 缺陷 2059。考虑链接中的示例

#include <map>

struct X
{
  template<typename T>
  X(T&) {}
};

bool operator<(const X&, const X&) { return false; }

void erasor(std::map<X,int>& s, X x)
{
  std::map<X,int>::iterator it = s.find(x);
  if (it != s.end())
    s.erase(it);
}

最后的调用map::erase是模棱两可的,因为两者map::erase(const_iterator)map::erase(key_type const&)很好匹配,因为它们都需要用户定义的转换。

重新引入map::erase(iterator)重载解决了这个问题。

于 2016-12-21T07:11:47.147 回答