将c ++变换的输出传递给函数

时间:2016-01-13 22:02:14

标签: c++

对不起,如果这是一个愚蠢的问题,但我是一个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的情况下执行此操作?提前谢谢!

3 个答案:

答案 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