从 STL 集中删除最大元素
这是我之前提出的问题的后续问题(STL max_element的复杂性) 。
我基本上想从集合中弹出最大元素,但我遇到了问题。
大致是我的代码:
set<Object> objectSet;
Object pop_max_element() {
Object obj = *objectSet.rbegin();
set<Object>::iterator i = objectSet.end()--; //this seems terrible
objectSet.erase(i); //*** glibc detected *** free(): invalid pointer
return obj;
}
早些时候我尝试过 objectSet.erase(objectSet.rbegin());
但编译器抱怨没有匹配的函数(我猜它不喜欢反向迭代器) 。我知道没有检查空集,但当 objectSet.size() >> 时失败。 0。
This is a follow-up on a previous question I had ( Complexity of STL max_element ).
I want to basically pop the max element from a set, but I am running into problems.
Here is roughly my code:
set<Object> objectSet;
Object pop_max_element() {
Object obj = *objectSet.rbegin();
set<Object>::iterator i = objectSet.end()--; //this seems terrible
objectSet.erase(i); //*** glibc detected *** free(): invalid pointer
return obj;
}
Earlier I tried objectSet.erase(objectSet.rbegin());
but the compiler complained that there was no matching function (I'm guessing it doesn't like the reverse_iterator). I know there is no checking for an empty set, but it's failing when objectSet.size() >> 0.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你已经非常接近了,但是你试图在迭代器分配中做太多的事情。您将后递减运算符应用于
end
返回的任何内容。我不太确定那是做什么的,但几乎可以肯定这不是你想要的。将end
的结果赋给i
,然后然后将其递减以获得集合的最后一个元素。You're pretty close, but you're trying to do a little too much in that iterator assignment. You're applying the post-decrement operator to whatever
end
returns. I'm not really sure what that does, but it's almost certainly not what you want. Assign the result ofend
toi
, and then decrement it to get the last element of the set.你需要这样做:
You need to do this:
该语句的
意思是“将 end() 分配给 i,然后递减一个即将被丢弃的临时变量”。换句话说,它与
set
没关系,这是本质上为集合重现
.back()
的合法方法。另外,反向迭代器有一个
base()
成员可以转换为普通迭代器,我猜你只能删除普通迭代器 - 尝试objectSet.erase(objectSet.rbegin().base() )
。The statement
means 'assign end() to i then decrement a temporary variable that is about to be thrown away'. In other words it's the same as
set<Object>::iterator i = objectSet.end();
, and I'm sure you recognise you cannot erase end(), because it points to one past the end. Use something like this instead:and that's okay, it's a legitimate way to essentially reproduce
.back()
for a set.Also, reverse iterators have a
base()
member to convert to a normal iterator and I guess you can only erase normal iterators - tryobjectSet.erase(objectSet.rbegin().base())
.