0

a の逆方向反復子は、 astd::map.rbegin()で最大の key_type を含む要素の位置を返しますstd::map
最大のキーを持つ要素には、次の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

関数/メソッドが 1 つの位置のみを取得するために反復子を必要とする場合、それがどの種類の反復子であるかは重要ではないと私には思えます。
そのイテレータが 1 つの位置以外の何かを記述した場合 (方向なども...)、状況は異なります。

注: 「逆イテレータを使用して消去を呼び出す方法は?」とは質問しませんでしたが、コードの最後の行でこの操作の解決策を提供しました。
逆イテレータで消去できない理由を尋ねています。つまり、消去する 1 つの要素の位置を取得するためだけに使用する必要がある場合、STL は単純にstd::map::reverse_iteratorto をキャストしないのはなぜですか。std::map:iterator

4

1 に答える 1