【问题标题】:Erase final member of std::set擦除 std::set 的最终成员
【发布时间】:2012-01-19 12:36:52
【问题描述】:

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

例如:

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

如何从setInt 中删除4?我试过类似的东西:

 setInt.erase(setInt.rbegin());

但我收到了一个错误。

【问题讨论】:

  • 你说得对,我忘了 set 没有随机访问迭代器。使用setInt.erase(std::prev(setInt.end()));

标签: c++ stl set


【解决方案1】:

在 C++11 中

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

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

【讨论】:

    【解决方案2】:
    if (!setInt.empty()) {
        std::set<int>::iterator it = setInt.end();
        --it;
        setInt.erase(it);
    }
    

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

    【讨论】:

      【解决方案3】:

      编辑:您应该使用std::prev,如Benjamin's better answer 所示,而不是此答案中建议的旧样式。


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

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

      假设您检查了setInt 不为空!

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

      【讨论】:

      • 狡猾,因为与std::vector&lt;int&gt;::iterator 不同,std::set&lt;int&gt;::iterator 不可能是指针。它必须是类类型,所以临时变量必须是可递减的。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果你想删除 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();没关系我做了一些阅读。 所以 -- on rbegin().base() 导致与 -- on end() 相同的结果。 两者都应该工作。

        【讨论】:

        • setInt.rend() 返回一个指向 setInt.begin() 之前的迭代器,因此它与集合的结尾无关。
        • 您的提案与问题中的提案有何不同,我们已经知道它不起作用?
        • 所以我再试一次 :-) 换了很多钱。我应该在写之前阅读:-)
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-07-18
          • 2014-04-04
          • 2011-03-22
          • 2013-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多