Почему нельзя удалить элементы из std:: map с помощью обратных итераторов?


Я искал наиболее эффективный и выразительный способ удалить последний элемент из 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 может принимать только std::map::const_iterator.

Более того, до C++11 он также мог принимать std::map::iterators, но по какой-то причине эта функциональность тоже была удалена.

Какая мотивация стоит за этими ограничениями?
1 3

1 ответ:

erase() Теперь возьмите const_iterators, чтобы сделать const_iterator действительно полезным. iterator преобразуется в const_iterator, поэтому исходная функциональность не изменяется.

reverse_iterator является адаптером итератора; он предоставляет функцию-член .base() для получения базового итератора, который можно передать в функции-члены контейнера. Тем не менее, crbegin().base() - это end(), а переход end() к erase() - это UB.