在 C++17 中,为什么关联容器有一个采用(非 const)`iterator` 的 `erase` 成员函数?
In C++17, why do associative containers have an `erase` member function that takes (non-`const`) `iterator`?
参见,例如, 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 中,第一个和第二个重载更改为采用 const_iterator
,以便可以使用 iterator
或 const_iterator
调用它们。第一个重载也得到了改进,使它成为 return 元素被删除后的迭代器:
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 );
为什么需要这个?它没有为范围 erase
、insert
或任何序列容器(例如 vector
、deque
和 list
添加。
这样做是为了解决 LWG defect 2059。考虑 link
中的示例
#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)
重载修复了这个问题。
参见,例如, 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 中,第一个和第二个重载更改为采用 const_iterator
,以便可以使用 iterator
或 const_iterator
调用它们。第一个重载也得到了改进,使它成为 return 元素被删除后的迭代器:
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 );
为什么需要这个?它没有为范围 erase
、insert
或任何序列容器(例如 vector
、deque
和 list
添加。
这样做是为了解决 LWG defect 2059。考虑 link
中的示例#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)
重载修复了这个问题。