擦除std :: set的最终成员

时间:2011-12-13 16:29:13

标签: c++ stl set

如何从集合中删除最后一个成员?

例如:

set<int> setInt;
setInt.insert(1);
setInt.insert(4);
setInt.insert(3);
setInt.insert(2);

如何从4删除setInt?我试过像:

 setInt.erase(setInt.rbegin());

但我收到了错误。

6 个答案:

答案 0 :(得分:34)

在C ++ 11中

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

您可以决定如何处理集合为空的情况。

答案 1 :(得分:18)

if (!setInt.empty()) {
    std::set<int>::iterator it = setInt.end();
    --it;
    setInt.erase(it);
}

顺便说一下,如果你这么做(按任意顺序添加东西然后删除顶部元素),你也可以看一下std::priority_queue,看看是否适合你的使用。

答案 2 :(得分:6)

我建议为rbegin使用一个具有正确类型的不同名称:

setInt.erase(--setInt.end());

假设您检查setInt不为空!

顺便说一下。这是有效的,因为您可以在临时(类型std::set<int>::iterator)上调用变异减量运算符。然后将此临时文件传递给擦除函数。

答案 3 :(得分:3)

性能稍差,但另一种选择:

setInt.erase(*setInt.rbegin());

答案 4 :(得分:1)

如果要删除4而不是最后一个,则应使用find方法。 根据用例4可能不是最后一个。

std::set<int>::iterator it = setInt.find(4);
if(it != setInt.end()) {
  setInt.erase(it);
} 

如果要删除最后一个元素,请使用:

if (!setInt.empty()) {
  setInt.erase(--setInt.rbegin().base());
  // line above is equal to 
  // setInt.erase(--setInt.end());
}

虽然我不确定是否 - * .end();是O.K.我做了一些阅读。 所以 - on rbegin()。base()导致与end()相同的结果。 两者都应该有效。

答案 5 :(得分:0)

检查该组是否为空。如果没有,则获取最后一个元素并将其设置为迭代器并减少该迭代器并擦除最后一个元素。

if (!setInt.empty())
 {
    std::set<int>::iterator it = setInt.end();
    --it;
    if(it != setInt.end()) {
    setInt.erase(it);
    } 
 }