Multiset擦除最后一个元素

时间:2012-01-24 19:14:29

标签: c++ multiset

我试图使用以下方法擦除多重集的最后一个元素:

minheap.erase(minheap.rbegin());

它不编译,并给出4-5个错误。

请注意,在C ++多字节中,.end()指向最后一个元素旁边,而不是最后一个元素。

有什么想法吗?

修改

为什么这会提供不同的数字?

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

multiset <int>::iterator it2 = minheap.end();
m2=*(--it2);
<德尔> 在multiset中添加了一些数据`m1是1`而`m2是2`。为什么不一样?

1 个答案:

答案 0 :(得分:18)

擦除函数必须将常规迭代器作为参数。要获得这样的迭代器,您可以尝试调用

minheap.erase(std::prev(minheap.end()));

这会调用end()来获取结尾的迭代器,然后使用新的C ++ 11 prev函数将其备份一步。如果您没有C ++ 11支持,您也可以写

minheap.erase(--minheap.end());

或者,既然您似乎在尝试将multimap用作min-heap,那么您是否考虑过使用priority_queue或者像push_heap和pop_heap这样的堆算法?

编辑:为了回答你的后续问题,你在这里获得两个不同值的原因是逻辑上,rbegin指向多图的最后一个元素,而不是它之前的一步,而结束点一个结束。以一步结束备份它会引用与rbegin相同的元素,所以如果你向前推进rbegin一步,它将最终指向最后一个元素前一步的元素。

希望这有帮助!