【问题标题】:How can I adapt the erase-remove idiom to work with vector tuples?如何调整擦除删除习惯用法以使用向量元组?
【发布时间】:2019-05-09 05:20:09
【问题描述】:

我有一个包含成员 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;

和 sn-p 用于插入(显然引用了其他函数和你有什么,但这会占用太多空间)

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

【问题讨论】:

  • 向我们展示vec_list_iter_exp_out的定义,以及插入其中的代码。

标签: c++ erase-remove-idiom


【解决方案1】:

remove_if 的第三个参数必须是一元谓词。相反,您传递的是一个表达式。

代替vec_list_iter_exp_out.k &lt; 33 试试[](const TriStore &amp;x){return x.k &lt; 33;} 之类的东西

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

来自this comment by 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&lt;double, double, double&gt; 而不是TriStore

【讨论】:

  • 这成功了!我还不能将问题标记为已回答,但一旦计时器用完,我就会这样做。另外,我太新了,无法显示赞成票,但是我做到了,而且您的回答非常好。谢谢!
  • 我很高兴知道它对您有所帮助。我相信你会喜欢阅读 C++ 中的 std::tuple 和 lambdas。
  • Gyapti,如果我想制作“33”变量,而不是传递给嵌套在初始函数中的东西,我将如何去做呢?我试图简单地使用现有的变量名并得到以下消息:“封闭函数局部变量不能在 lambda 主体中引用,除非它在捕获列表中”
  • @JudsonClark 您需要通过引用或值来捕获变量,例如 [&amp;value](const TriStore&amp; x) {return x.k &lt; value;} 其中value 要捕获的变量。请注意,我是通过引用捕获它,如果您想按值捕获它,请使用[value](const TriStore&amp; x) {return x.k &lt; value;}
  • 谢谢@NishantSingh。我对此评论迟到了,将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多