Мультисет стереть последний элемент - PullRequest
8 голосов
/ 24 января 2012

Я пытаюсь стереть последний элемент мультимножества, используя:

minheap.erase(minheap.rbegin());

Не компилируется и выдает 4-5 ошибок.

Обратите внимание, что в мультимножествах C ++ .end() указывает рядом с последним элементом, а не с последним элементом.

Есть идеи?

EDIT:

Почему это дает разные номера?

multiset <int>::reverse_iterator it1 = minheap.rbegin();
m1=*(++it1);

multiset <int>::iterator it2 = minheap.end();
m2=*(--it2);
С некоторыми данными, добавленными в мультимножество, `m1 равно 1`, а` m2 равно 2`. Почему они не одинаковы?

1 Ответ

18 голосов
/ 24 января 2012

Функция стирания должна принимать в качестве аргумента обычный итератор. Чтобы получить такой итератор, вы можете попробовать вызвать

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 вперед на один шаг, он в конечном итоге будет указывать на элемент за шаг до последнего элемента.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...