为什么反向迭代器 .rbegin() 被阻止用作要擦除的 elemet 的位置?



std::map.rbegin()的反向迭代器返回包含std::map中最大key_type的元素的位置。
可以使用map.rbegin()返回的位置访问具有最大键的元素,如下所示:
map.rbegin()->first

但是,map.rbegin()返回的位置不能用于擦除此元素。

为什么我可以访问但不能擦除相同的位置?

std::map <unsigned int, std::string> map;
map.emplace(5, "aaa");
map.emplace(7, "bbb");
map.emplace(3, "ccc");
cout << map.rbegin()->first << " : " << map.rbegin()->second << endl;       //Reverse iterator works for accessing the element
map.erase(map.rbegin());      //Erase the largest element in the map - Error C2664 converting argument 1 from 'std::reverse_iterator<std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>>' to 'std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>'    
map.erase(std::prev(map.end()));    //Erase the largest element in the map - WORKS
map.erase(std::prev(map.rbegin().base()));  //Erase the largest element in the map - WORKS

在我看来,如果一个函数/方法只需要一个迭代器来获得一个位置,那么它是什么样的迭代器就无关紧要了。
如果该迭代器描述的不仅仅是一个位置(例如方向,也是......

注意:我没有问"如何使用反向迭代器调用擦除?",我在代码的最后一行中提供了此操作的解决方案。
我在问为什么我不能用反向迭代器擦除。即,如果 STL 只需要使用它来获取要擦除的一个元素的位置,为什么不简单地将std::map::reverse_iterator转换为std::map:iterator

为什么反向迭代器 .rbegin() 被阻止用作要擦除的 elemet 的位置?

因为erase的参数类型不是reverse_iterator,而是iterator。这些是不同的类型。

为什么我可以访问但不能擦除相同的位置?

知道对象在内存中的位置(这是您可以访问对象时所知道的)通常不足以访问包含该元素的数据结构。

最新更新