Почему нельзя удалить элементы из 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 ответ:
erase()Теперь возьмитеconst_iterators, чтобы сделатьconst_iteratorдействительно полезным.iteratorпреобразуется вconst_iterator, поэтому исходная функциональность не изменяется.
reverse_iteratorявляется адаптером итератора; он предоставляет функцию-член.base()для получения базового итератора, который можно передать в функции-члены контейнера. Тем не менее,crbegin().base()- этоend(), а переходend()кerase()- это UB.