为什么不能使用反向迭代器从std :: map中删除元素?

时间:2015-03-13 02:49:26

标签: c++ c++11 associative-array c++-standard-library

我一直在寻找从std::map中移除最后一个元素的最有效和最富有表现力的方法。我试过了:

#include <map>

int main()
{
    std::map<int, int> m;
    m.insert(std::make_pair(1,1));
    m.erase(m.crbegin());
    return 0;
}

代码无法编译,因为std::map::erase可以only std::map::const_iterator

此外,在C ++ 11之前,它也可能需要std::map::iterator,但由于某种原因,此功能也已被删除。

这些限制背后的动机是什么?

1 个答案:

答案 0 :(得分:2)

erase()现在需要const_iterator来使const_iterator真正有用。 <{1}}可转换为iterator,因此原始功能不受影响。

const_iterator是一个迭代器适配器;它公开了一个reverse_iterator成员函数来获取底层迭代器,您可以将其传递给容器成员函数。也就是说,.base()crbegin().base(),将end()传递给end()为UB。