c++ - 多集删除最后一个元素

标签 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`。为什么那些不一样?

最佳答案

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

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

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

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

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

编辑:为了回答您的后续问题,您在这里获得两个不同值的原因是逻辑上,rbegin 指向 multimap 的最后一个元素,而不是它之前的一步, 而终点指向终点。将 end 后退一步使其指向与 rbegin 相同的元素,因此如果您随后将 rbegin 向前推进一步,它将最终指向最后一个元素之前一步的元素。

希望这对您有所帮助!

关于c++ - 多集删除最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8992658/

相关文章:

algorithm - 是否有一种算法可以生成多重集的所有唯一循环排列?

c++ - 根据GL标志的Visual Studio 19-17库兼容性

algorithm - 可以处理这些查询的算法

C++ RNG : how to get different rand generators on different processors?

c++ - 为什么包括原子 - 给出错误

c++ - 多组对象

列出将数字分解为 k 个因子的所有可能方法的算法?

c++ - 为什么自定义数据的 thrust::sort 需要默认构造函数而 STL::sort 不需要?

c++ - Pimpl 带有包含类的 header