【问题标题】:Multiset erase last element多组擦除最后一个元素
【发布时间】:2012-02-18 01:02:44
【问题描述】:

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

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

【问题讨论】:

  • 关于您的编辑:您不需要++it1rbegin 已经指向最后一个元素。
  • 哦,你是对的,对不起,我来晚了:D

标签: c++ multiset


【解决方案1】:

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

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

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

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

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

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

希望这会有所帮助!

【讨论】:

  • @KerrekSB-哇!这太酷了!我需要开始阅读 C++11 中的更改。 :-)
  • 请查看我的更新:D。而且,“--minheap.end()”是否也改变了存储在 minheap.end() 中的值(递减)?
  • @Cristy- 已更新以响应您的新问题(顺便说一句,这确实应该作为第二个问题发布,因为它在逻辑上非常不同)。不,--end 不会改变 end 的值。调用 end 会返回一个迭代器,而这个新的迭代器会被递减。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2013-10-28
  • 2012-01-05
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多