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