带有lambda谓词的std :: remove_if

时间:2015-04-02 15:17:33

标签: c++ vector stl

我想基于lambda谓词从矢量中删除一个对象:

class tmr
{
public:
  tmr();
  ~tmr();
  static void start();
  bool is_time_out(double sec);
  double t_elapsed();
};

struct sobj
{
  int count;
  bool tflag;
  int ID;
  tmr timer;
  friend bool is_stime(timer& objtimer,double sec)
   {
    return objtimer.is_time_out(sec);
   }
};

在主程序的某个地方,我填充vector<sobj>,然后一段时间后,我想要删除指定了ID并且其计时器已经过去的元素。

我这样做了,它抱怨无法将void转换为bool

sobj strobj;
vector<sobj> vecobj;

vecobj.erase(std::remove_if(vecobj.begin(),vecobj.end(),[&](const sobj& mysobj){return ( mysobj.ID== THE_ID && mysobj.is_stime(mysobj.timer,5));}),vecobj.end());

2 个答案:

答案 0 :(得分:4)

首先要做的事情:

让我们注意,这与lambda几乎没什么关系。以下代码也将无法编译:

sobj strobj;
is_stime(strobj.timer, 5);

采取的步骤:

  1. 让我们减少您的测试用例..
  2. is_stime()需要使用const引用,或者你的lambda需要传递一个非const引用。
  3. 你的lambda看不到
  4. is_stime()Would you like to know more?
  5. 简化代码:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int THE_ID;
    
    class tmr {
    };
    
    struct sobj {
        int ID;
        tmr timer;
    
        friend bool is_stime(tmr const & objtimer, double sec);
    };
    
    bool is_stime(tmr const & objtimer, double sec) {
        return true;
    }
    
    int main() {
        vector<sobj> vecobj;
        vecobj.erase(std::remove_if(vecobj.begin(),vecobj.end(),[&](const sobj& mysobj){return ( mysobj.ID == THE_ID && is_stime(mysobj.timer,5));}),vecobj.end());
    }
    

答案 1 :(得分:1)

你的lambda缺少一个返回类型:

[&](const sobj& mysobj)->bool