混淆map :: erase()的重载决议

时间:2015-11-30 08:23:07

标签: c++

我正在阅读Nico的 The C ++ Standard Library 2nd edition 一书。他在第343页向我展示了erase() map函数的示例:

std:map<std::string, float> coll;
// ...
for (auto pos = coll.begin(); pos != coll.end(); ) {
    if (pos->second == value) {
        pos = coll.erase(pos);   // since C++ 11

        // C++ 98
        // coll.erase(pos++);
    } else {
        ++pos;
    }
}

cplusplus.com说:

void erase( iterator position );               // C++ 98
iterator erase( const_iterator position );     // C++ 11

我的问题是重载决策如何在上一个示例中选择C ++ 11版本返回最后删除元素的迭代器?示例中pos的类型为iterator,不是吗?

1 个答案:

答案 0 :(得分:1)

std::map<X>::iterator被指定为可转换为std::map<X>::const_iterator,因此您可以将前者传递给期望后者的函数。

过载分辨率不需要在这两个函数之间进行选择,因为它们是互斥的:C ++ 98在C ++ 11中不可用,反之亦然。

以下是C ++ 11中提供的std::map::erase版本,来自N3337标准草案[map]/2

iterator erase(const_iterator position);
size_type erase(const key_type& x);
iterator erase(const_iterator first, const_iterator last);