我如何调整 erase-remove 习语来处理向量元组?
How can I adapt the erase-remove idiom to work with vector tuples?
我有一个包含成员 j、k 和 l 的元组向量。我正在尝试修改 erase-remove 习语,以便在 .k 成员的值满足特定条件时我可以删除整个元组。
我尝试使用标准的 .erase(removeif()) 方法,其中谓词引用元组成员位置,但被告知相关向量的 class 没有成员 "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;
和用于插入的代码片段(显然引用了其他函数和您拥有的东西,但这会占用太多空间 space)
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());
}
}
}
remove_if
的第三个参数需要是一元谓词。相反,您正在传递一个表达式。
而不是 vec_list_iter_exp_out.k < 33
尝试 [](const TriStore &x){return x.k < 33;}
What if I want to decide this 33
at runtime
来自:请使用
[&value](const TriStore& x) {return x.k < value;} // Capture by reference
[value](const TriStore& x) {return x.k < value;} // Capture by value
p.s。为什么不用 TriStore
而不是 tuple<double, double, double>
?
我有一个包含成员 j、k 和 l 的元组向量。我正在尝试修改 erase-remove 习语,以便在 .k 成员的值满足特定条件时我可以删除整个元组。
我尝试使用标准的 .erase(removeif()) 方法,其中谓词引用元组成员位置,但被告知相关向量的 class 没有成员 "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;
和用于插入的代码片段(显然引用了其他函数和您拥有的东西,但这会占用太多空间 space)
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());
}
}
}
remove_if
的第三个参数需要是一元谓词。相反,您正在传递一个表达式。
而不是 vec_list_iter_exp_out.k < 33
尝试 [](const TriStore &x){return x.k < 33;}
What if I want to decide this
33
at runtime
来自
[&value](const TriStore& x) {return x.k < value;} // Capture by reference [value](const TriStore& x) {return x.k < value;} // Capture by value
p.s。为什么不用 TriStore
而不是 tuple<double, double, double>
?