【问题标题】:Using std::list::remove_if with MyClass' function [duplicate]使用带有 MyClass 函数的 std::list::remove_if [重复]
【发布时间】:2015-05-26 07:38:00
【问题描述】:

我有std::list<MyClass> *info1 我想将(*info1).remove_if 与MyClass 的布尔函数一起使用。如我所见,每个人都为 remove_if 创建外部函数或结构。不可以和bool MyClass::Condition()函数一起使用吗?

像这样:

 class MyClass
{
private:
    int value;
public:
    bool Condition()
    {
      return ( value > 7500);
    }
};

然后

   (*info1).remove_if(Condition())`

【问题讨论】:

    标签: c++ list stl stdlist


    【解决方案1】:

    可以通过std::mem_fn:

    info1->remove_if(std::mem_fn(&MyClass::Condition));
    

    Live demo

    或通过std::bind:

    using namespace std::placeholders;
    info1->remove_if(std::bind(&MyClass::Condition, _1));
    

    Live demo

    这两个函数都包含在标准 <functional> 标头中。

    【讨论】:

    • std::mem_fn 输入较少。
    • 谢谢,std::mem_fn 完全符合我的要求。
    【解决方案2】:

    对于您想做的事情,最好使用用户标准算法

    std::remove_if(info1->begin(), info1->end(),[](MyClass x){return x.Condition();})
    

    【讨论】:

    • 呃,std::list::remove_if 是标准算法。
    • 是的,它是对 std::remove_if 的重新实现
    • std::list::remove_if 存在是有原因的。
    • 这是懒惰的开发者的架构 c++ 错误
    • @gregoryboero.teyssier 不,它们的存在是因为它们比独立算法更有效。
    【解决方案3】:

    您可以在 MyClass 中使用 add an operator() 并将其用作谓词,这是一个示例:

    #include <iostream>
    #include <list>
    
    using namespace std;
    class MyClass
    {
      private:
        int value;
      public:
        MyClass(int val) : value(val) {}
        int get_value() const { return value; }
        bool operator()(const MyClass& M)
        {
          return (M.value > 7500);
        }
    };
    
    int main() {
      list<MyClass> v;
      v.emplace_back(100);
      v.emplace_back(10000);
      v.emplace_back(500);
      v.emplace_back(7500);
      v.emplace_back(50000);
      v.remove_if(MyClass(0));
      for (const auto& i : v) {
        cout << i.get_value() << "\n";
      }
      return 0;
    }
    

    【讨论】:

    • 这是一个坏主意,因为您实际上将MyClass 用作谓词和其他东西(取决于MyClass 的原始含义)。特别是如果 MyClass 不应该具有“可调用”语义。
    • 为什么我有一个 -1 这不起作用?我实际测试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2021-08-08
    相关资源
    最近更新 更多