Почему невозможно удалить элементы из 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_iteratorчтобы сделать const_iterator на самом деле полезно. iterator конвертируется в const_iterator, поэтому на оригинальную функциональность это не влияет.

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

Другие вопросы по тегам