Функция стирания должна принимать в качестве аргумента обычный итератор. Чтобы получить такой итератор, вы можете попробовать вызвать
minheap.erase(std::prev(minheap.end()));
Вызывает end (), чтобы получить итератор до конца, а затем резервирует его на один шаг, используя новую функцию C ++ 11 prev. Если у вас нет поддержки C ++ 11, вы можете написать
minheap.erase(--minheap.end());
В качестве альтернативы, поскольку кажется, что вы пытаетесь использовать мультикарту в качестве мини-кучи, рассматривали ли вы вместо этого использование priority_queue или алгоритмы кучи, такие как push_heap и pop_heap?
РЕДАКТИРОВАТЬ : Чтобы ответить на ваш дополнительный вопрос, причина, по которой вы получаете здесь два разных значения, заключается в том, что логически rbegin указывает на последний элемент мультикарты, а не на шаг впереди него, в то время как конечные точки один за другим. При резервном копировании end на один шаг он ссылается на тот же элемент, что и rbegin, поэтому, если вы затем продвигаете rbegin вперед на один шаг, он в конечном итоге будет указывать на элемент за шаг до последнего элемента.
Надеюсь, это поможет!