如何使擦除删除习惯用法与矢量元组一起使用?

Jud*_*ark 4 c++ erase-remove-idiom

我有一个成员为j,k和l的元组向量。我正在尝试适应“擦除删除”习惯用法,以便如果.k成员的值满足特定条件,则可以删除整个元组。

我尝试使用标准.erase(removeif())方法,其中谓词引用了元组成员位置,但被告知所涉及的向量类中没有成员“ k”。

vec_list_iter_exp_out.erase(
    std::remove_if(
        vec_list_iter_exp_out.begin(),
        vec_list_iter_exp_out.end(), 
        vec_list_iter_exp_out.k < 33), vec_list_iter_exp_out.end());
Run Code Online (Sandbox Code Playgroud)

我希望如果vec_list_iter_exp_out由以下假设值组成:

vec_list_iter_exp_out[0] = 5, 22, 9
vec_list_iter_exp_out[1] = 12, 31, 54
vec_list_iter_exp_out[2] = 17, 42, 0
vec_list_iter_exp_out[3] = 253, 3, 5
vec_list_iter_exp_out[4] = 65, 110, 24
Run Code Online (Sandbox Code Playgroud)

vec_list_iter_exp_out [2]和vec_list_iter_exp_out [4]的全部将被删除,然后vec_list_iter_exp_out将包括以下内容:

vec_list_iter_exp_out[0] = 5, 22, 9
vec_list_iter_exp_out[1] = 12, 31, 54
vec_list_iter_exp_out[2] = 253, 3, 5
Run Code Online (Sandbox Code Playgroud)

相反,我得到了上述编译错误。

任何帮助将不胜感激!

编辑:根据要求定义所讨论的向量。

struct TriStore
{
    double j,k,l;
};

std::vector<TriStore> vec_list_iter_exp_out;
Run Code Online (Sandbox Code Playgroud)

和用于插入的代码段(显然引用了其他功能和所拥有的功能,但这会占用太多空间)

    for(int z = 1; z <= iters; z++)
    {
        vec_iters.push_back(vec_list_iter_exp_out.size());
        for(int i = vec_iters[z-1]; i < vec_iters[z]; i++)
        {
            if(vec_list_iter_exp_out[i].k < kk)
            {
                triangle_list(vec_list_iter_exp_out[i].j,vec_list_iter_exp_out[i].k,vec_list_iter_exp_out[i].l);
                vec_list_iter_exp_out.insert(vec_list_iter_exp_out.end(),vec_tri_list.begin(),vec_tri_list.end());
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Gya*_*ain 6

第三个论点remove_if必须是一元谓词。相反,您正在传递一个表达式。

而不是vec_list_iter_exp_out.k < 33尝试像[](const TriStore &x){return x.k < 33;}

如果我想33在运行时决定该怎么办

来自Nishant Singh的评论:请使用

[&value](const TriStore& x) {return x.k < value;}  // Capture by reference
[value](const TriStore& x) {return x.k < value;}  // Capture by value
Run Code Online (Sandbox Code Playgroud)

ps而不是TriStore为什么不使用tuple<double, double, double>

  • @JudsonClark,您需要通过引用或值来捕获变量,例如`[&value](const TriStore&x){return xk &lt;value;}`,其中`value`要捕获的变量。请注意,我是通过引用捕获它,如果您想通过值捕获它,请使用`[value](const TriStore&x){return xk &lt;value;}` (2认同)