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