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
。这些是不同的类型。
为什么我可以访问但不能擦除相同的位置?
知道对象在内存中的位置(这是您可以访问对象时所知道的)通常不足以访问包含该元素的数据结构。