为什么无法使用反向迭代器从 std::map 中删除元素

Why is it not possible to remove elements from a std::map using reverse iterators?

本文关键字:std map 元素 删除 迭代器 为什么      更新时间:2023-10-16

我一直在寻找最有效和最具表现力的方法来从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只能std::map::const_iterator

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

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

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

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