我试图使用以下方法擦除多重集的最后一个元素:
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`。为什么不一样? 德尔>
答案 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一步,它将最终指向最后一个元素前一步的元素。
希望这有帮助!