Multiset擦除最后一个元素

Cri*_*sty 9 c++ multiset

我试图使用以下方法擦除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);
Run Code Online (Sandbox Code Playgroud) 在multiset中添加了一些数据`m1是1`而`m2是2`.为什么不一样?

tem*_*def 19

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

minheap.erase(std::prev(minheap.end()));
Run Code Online (Sandbox Code Playgroud)

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

minheap.erase(--minheap.end());
Run Code Online (Sandbox Code Playgroud)

或者,因为您似乎正在尝试将多重映射用作最小堆,您是否考虑过使用priority_queue或堆算法(如push_heap和pop_heap)?

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

希望这可以帮助!