簡體   English   中英

std :: remove_if與lambda謂詞

[英]std::remove_if with lambda predicate

我想從基於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());

首先要注意的是:

讓我們注意,這與lambda無關。 以下代碼也將無法編譯:

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

采取的步驟:

  1. 讓我們減少測試用例。
  2. is_stime()需要采用const引用,否則lambda需要傳遞非const引用。
  3. is_stime()對您的lambda不可見。 你想知道更多嗎?

簡化代碼:

#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());
}

您的Lambda缺少返回類型:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM