对不起,如果这是一个愚蠢的问题,但我是一个c ++菜鸟,我还没有找到答案。我正在使用boost multi_array,我尝试做类似的事情:
typedef boost::multi_array<double,2> array2D;
typedef array2D::array_view<1>::type array2Drow;
typedef boost::multi_array_types::index_range range;
...
array2D A = ... (2-d array) ...;
array2Drow X = A(boost::indices[0][range()]);
...
returnVal1 = f(X);
returnVal2 = f(X+0.1*X);
returnVal3 = f(X-0.1*X);
我正在尝试使用std :: transform;我知道我可以编写某种类型的仿函数(称之为#34; op&#34;),它将X乘以0.1并从X中加/减结果,但这就是我遇到麻烦的地方 - 我没有&#39;知道该怎么代替???:
returnVal1 = f(X);
returnVal2 = f(transform(X.begin(),X.end(),???,op(0.1,X)));
returnVal3 = f(transform(X.begin(),X.end(),???,op(-0.1,X)));
有没有办法在不定义中间对象然后传递给f的情况下执行此操作?提前谢谢!
答案 0 :(得分:1)
???
需要是要存储转换操作结果的容器的迭代器,即op
的返回值
然而,你的想法是错误的。
std::transform
返回(请参阅http://en.cppreference.com/w/cpp/algorithm/transform)
返回值
将迭代器输出到经过最后一个元素转换后的元素。
将迭代器传递给函数是没有意义的,因为它是容器的end
。
此外,op
的签名不符合std::transform
的要求。
答案 1 :(得分:1)
如果函数f
占用容器,则必须使用转换后的值创建容器。在您的示例中,您似乎还希望X
在第一次转换时保持不变,因此您不能只在原地进行修改
returnVal1 = f( X );
transform( X.begin(), X.end(), X.begin(),
[]( double val ){ return val + 0.1*val; } );
returnVal2 = f( X );
如果您不想创建明确的本地临时工,那么您可以使用辅助函数构建它们。
// pass in by value to get a copy, modify it inplace and return it
array2Drow transformed( array2Drow copy, double factor )
{
std::transform( copy.begin(), copy.end(), copy.begin(),
[&]( double val ){ return val + factor*val; } ) );
return copy;
}
然后可以使用帮助程序写入返回值的计算。
returnVal1 = f( X );
returnVal2 = f( transformed( X, 0.1 ) );
returnVal3 = f( transformed( X, -0.1 ) );
答案 2 :(得分:1)
如果f
期望收到array2Drow
,那么您需要传递一个(包含正确的数据)。
有了这个,您实际上只有几个选择:修改现有集合中的数据(并重复传递相同的集合),或者每次调用时都创建一个新集合。
如果f
实际上一次只需要其中一个项目(例如,像累加器一样),那么您可以重写f
一次只能输入一个输入,然后是每次“运行”结束,检索值并重置累加器。
在这种情况下,您可以创建一个迭代器类型,该类型将为每个项目创建时调用累加器,并将该累加器的实例作为应写入结果的目标传递给std::transform
。 / p>
供参考,您可能需要查看Boost Accumulators。