【问题标题】:Why is it not possible to remove elements from a std::map using reverse iterators?为什么不能使用反向迭代器从 std::map 中删除元素?
【发布时间】:2015-05-15 10:54:22
【问题描述】:

我一直在寻找从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::iterators,但由于某种原因,此功能也被删除了。

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

【问题讨论】:

  • const_iterator 是否从迭代器定义转换构造函数?
  • @jschultz410,哦,是的,这可能是 C++11 中弃用的原因。
  • 如果是这样,我只是在这里推测,那么这些函数会更通用,并且不会违反 const_iterators 的 const'ness,因为您不是在更改值本身,而是将其删除来自收藏。

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


【解决方案1】:

erase() 现在使用const_iterators 以使const_iterator 真正有用。 iterator 可转换为const_iterator,因此不影响原有功能。

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

【讨论】:

  • 谢谢!所以我必须做m.erase(--m.end())
  • @MartinDrozdik 我会选择m.erase(std::prev(m.end()))-- 不保证适用于右值。
猜你喜欢
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 2016-04-15
相关资源
最近更新 更多