为什么不能使用反向迭代器从 std::map 中删除元素?
Why is it not possible to remove elements from a std::map using reverse iterators?
我一直在寻找从 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
秒,但出于某种原因,此功能也被删除了。
这些限制背后的动机是什么?
erase()
现在需要 const_iterator
秒才能使 const_iterator
真正有用。 iterator
可转换为 const_iterator
,因此原有功能不受影响。
reverse_iterator
是迭代器适配器;它公开了一个 .base()
成员函数来获取底层迭代器,您可以将其传递给容器成员函数。也就是说,crbegin().base()
是 end()
,将 end()
传递给 erase()
是 UB。
我一直在寻找从 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
秒,但出于某种原因,此功能也被删除了。
这些限制背后的动机是什么?
erase()
现在需要 const_iterator
秒才能使 const_iterator
真正有用。 iterator
可转换为 const_iterator
,因此原有功能不受影响。
reverse_iterator
是迭代器适配器;它公开了一个 .base()
成员函数来获取底层迭代器,您可以将其传递给容器成员函数。也就是说,crbegin().base()
是 end()
,将 end()
传递给 erase()
是 UB。