remove_if中的lambda用法不正确

时间:2016-03-25 18:20:16

标签: c++ vector lambda remove-if

所以我有一个矢量像这样的矢量:

vector<vector<int>> vec;

我正在尝试使用比较器(pred)迭代vec中的向量,并确定哪些向量通过remove_if和erase删除。到目前为止,我的代码如下:

vector<vector<int>> deleted_vecs;    

vec.erase(remove_if(vec.begin(), vec.end(),
                               ([vec, pred](vector<int> x) {
                                 if (pred(x)) {
                                     return true;
                                 }
                                 else {
                                     deleted_vecs.push_back(x);
                                     return false;
                                 }
                               },
                               vec.end())));

我在做语法方面有什么问题吗?

我的编译器错误在线上&#34; if(pred(x))&#34;和&#34; deleted_vecs.push_back(x);&#34;并说没有匹配函数调用pred和push_back,虽然我的谓词专门用于接收向量,我已将deleted_vecs声明为向量&gt;。 这让我觉得这是我如何宣布x的问题,但我不确定。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

括号和捕获列表都有错误。

您正在按值捕获已使用的变量,最终会复制对象。 尝试通过引用而不是值来捕获变量。 见http://en.cppreference.com/w/cpp/language/lambda

例如:

 vec.erase(
    std::remove_if(vec.begin(), vec.end(),
    [&](std::vector<int> x) {
      if (pred(x)) {
        return true;
      }
      else {
        deleted_vecs.push_back(x);
        return false;
      }
    }),
    vec.end());