11

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

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 is 1` 和 `m2 is 2` 。为什么那些不一样?
4

1 回答 1

23

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

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

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

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

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

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

希望这可以帮助!

于 2012-01-24T19:16:31.673 回答