删除 std::set 的最终成员

发布于 2024-12-21 11:53:30 字数 290 浏览 1 评论 0原文

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

例如:

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

如何从 setInt 中删除 4?我尝试过类似的操作:

 setInt.erase(setInt.rbegin());

但收到错误。

How can I delete the last member from a set?

For example:

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

How can I delete 4 from setInt? I tried something like:

 setInt.erase(setInt.rbegin());

but I received an error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

夏夜暖风 2024-12-28 11:53:30

在 C++11 中,

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

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

in C++11

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

You can decide how you want to handle cases where the set is empty.

挥剑断情 2024-12-28 11:53:30
if (!setInt.empty()) {
    std::set<int>::iterator it = setInt.end();
    --it;
    setInt.erase(it);
}

顺便说一句,如果您经常这样做(以任意顺序将内容添加到集合中,然后删除顶部元素),您还可以查看 std::priority_queue,看看是否适合您的用途。

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

By the way, if you're doing this a lot (adding things to a set in arbitrary order and then removing the top element), you could also take a look at std::priority_queue, see whether that suits your usage.

昨迟人 2024-12-28 11:53:30

编辑:您应该使用 std::prev< /a> 如Benjamin的更好答案所示,而不是本答案中建议的旧样式。


我会提出对具有正确类型的 rbegin 使用不同的名称:

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

假设您检查了 setInt 不为空!

顺便提一句。这是有效的,因为您可以在临时变量(类型为 std::set::iterator)上调用变异递减运算符。然后这个临时值将被传递给擦除函数。

Edit: You should use std::prev as shown in Benjamin's better answer instead of the older style suggested in this answer.


I'd propose using a different name for rbegin which has a proper type:

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

Assuming you checked that setInt is not empty!

Btw. this works because you can call the mutating decrement operator on a temporary (of type std::set<int>::iterator). This temporary will then be passed to the erase function.

请持续率性 2024-12-28 11:53:30

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

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

A bit less performant, but an alternative option:

setInt.erase(*setInt.rbegin());
青春如此纠结 2024-12-28 11:53:30

如果你想删除 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();没关系,我读了一些书。
因此 rbegin().base() 上的 -- 会导致与 end() 上的 -- 相同的结果。
两者都应该有效。

If you want to delete 4 instead of the last you should use the find method.
Depending on the use case 4 might not be the last.

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

If you want to delete the last element use:

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

While I was not sure if --*.end(); is O.K. I did some reading.
So the -- on rbegin().base() leads to the same result as -- on end().
And both should work.

如此安好 2024-12-28 11:53:30

检查集合是否为空。如果不是,则获取最后一个元素并将其设置为迭代器,并减少该迭代器并删除最后一个元素。

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

Check if the set is empty or not. If not, then get the last element and set that as iterator and reduce that iterator and erase the last element.

if (!setInt.empty())
 {
    std::set<int>::iterator it = setInt.end();
    --it;
    if(it != setInt.end()) {
    setInt.erase(it);
    } 
 }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文