如何将擦除-移除惯用法适应于向量元组?

4

我有一个元组的向量,其中包含成员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());

假如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

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

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

任何帮助将不胜感激!

编辑:按要求提供有关向量的定义。

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

std::vector<TriStore> vec_list_iter_exp_out;

并添加插入片段的代码(显然参考了其他函数等内容,但这会占用大量空间)

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

1
请展示vec_list_iter_exp_out的定义,以及插入代码。 - CinCout
1个回答

6
remove_if的第三个参数需要是一个单元谓词(unary predicate),而不是一个表达式。
尝试像这样使用 [](const TriStore &x){return x.k < 33;},而不是 vec_list_iter_exp_out.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

附注:为什么不使用tuple<double,double,double>而使用TriStore


1
这个方法可行!我现在还不能标记问题已解决,但是一旦计时器结束我就会这么做。另外,我太新了无法显示赞同,但我已经点赞了,你的回答非常好。谢谢! - Judson Clark
1
我很高兴知道它对你有所帮助。我相信你会喜欢阅读关于C++中的std::tuple和lambda表达式的内容。 - Gyapti Jain
Gyapti,如果我想把“33”变成一个传递到初始函数中的变量,该怎么做呢?我尝试使用现有的变量名称,但出现了这个消息:“除非在捕获列表中,否则无法在lambda主体中引用封闭函数的本地变量”。 - Judson Clark
2
@JudsonClark,你需要通过引用或值来捕获变量,例如[&value](const TriStore& x) {return x.k < value;},其中value是你想要捕获的变量。请注意,我是通过引用来捕获它的,如果你想通过值来捕获它,请使用[value](const TriStore& x) {return x.k < value;} - Nishant Singh
感谢@NishantSingh。我晚了发表评论,会将其添加到答案中。 - Gyapti Jain
所以这是正确的实现吗?vec_list_iter_exp_out.erase(std::remove_if(vec_list_iter_exp_out.begin(),vec_list_iter_exp_out.end(), [&kk](const TriStore &x){return x.k < kk;}),vec_list_iter_exp_out.end()); 仅供参考,kk 的类型为 double。 - Judson Clark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接