【问题标题】:std::remove_if with lambda predicate带有 lambda 谓词的 std::remove_if
【发布时间】:2015-04-02 15:17:33
【问题描述】:

我想根据 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());

【问题讨论】:

  • 您能否显示您的编译器及其版本,并粘贴实际错误?
  • @Useless:无用的部分是 Sam 没有包含这部分错误:foo.cc:11:16: error: use of undeclared identifier 'is_sobj'
  • 你能发布实际的错误信息,而不是你的解释吗?突出显示、复制、粘贴到文本编辑器中,在每行前面添加 4 个空格(s/^/ / 假设您的编辑器是 vi),然后将其编辑到您的帖子中。
  • 首先,编译器是C++11。我做了答案中的建议,错误是:错误:将'const timer'作为'bool timer :: is_time_out(double)'的'this'参数传递会丢弃限定符[-fpermissive]返回到.obj_timer.is_time_out(sec) ;
  • 好的,我会发布输出,我只需要编辑它,我无法透露一些输出信息

标签: c++ vector stl


【解决方案1】:

第一件事:

请注意,这与 lambda 关系不大。以下代码也会编译失败:

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

采取的步骤:

  1. 让我们减少您的测试用例..
  2. is_stime() 需要接受 const 引用,或者您的 lambda 需要传递非 const 引用。
  3. is_stime() 对您的 lambda 不可见。 Would you like to know more?

精简代码:

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

【讨论】:

  • 是否可以将 tmr 类的“is_time_out(double sec)”渲染为 lambda 函数可访问/可见,我可以绕过 struct 的友元函数
  • @SamGomari:对不起,我不明白你的意思。
  • 你可以看到 tmr 类有一个函数 "is_time_out" ,并且由于 tmr 对象是 sobj 结构的成员,我想知道是否可以简单地让 lambda 返回 "is_time_out" 的结果" ,而 sobj 不必具有功能。只需直接访问 tmr 的成员函数并从 lambda 函数返回其结果即可将其从向量中删除。
  • @SamGomari:我看不出有什么理由你不能这样做。
  • 问题是 [&](const sobj& mysobj){return ... } 中的 const。非常感谢
【解决方案2】:

您的 lambda 缺少返回类型:

[&](const sobj& mysobj)->bool
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 2017-03-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多