我试图使用以下方法擦除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)
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向前推进一步,它将最终指向该元素在最后一个元素之前一步.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4928 次 |
| 最近记录: |