0

a 的反向迭代器std::map.rbegin()返回包含 a 中最大 key_type 的元素的位置std::map
可以使用返回的位置访问具有最大 Key 的元素,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

在我看来,如果一个函数/方法需要一个迭代器来获得一个位置,那么它是什么类型的迭代器并不重要。
如果该迭代器描述的不仅仅是一个位置(例如方向,也......),事情会有所不同

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

4

1 回答 1

0

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

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

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

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

于 2020-12-07T16:05:39.693 回答