4

我尝试v使用其他一些算术运算(不在代码中)将向量的所有元素转换为它们的对数值。我如何使用 Boost.Lambda 来实现这一目标?

正如我所说,还有一些算术运算,因此带有 Boost.Bind 的表达式对我不起作用(太复杂、太长、不可读)。

我也不想使用 C++11 lambdas。但是……它会改变什么吗?

我的代码是这样的:

#include <boost/lambda/lambda.hpp>
#include <cmath>
#include <vector>

void testLambda()
{
    using namespace boost::lambda;

    std::vector<double> v;
    v.push_back(1); v.push_back(2); v.push_back(3);

    std::transform(v.begin(), v.end(), v.begin(), _1 / 0.5);     // works
    std::transform(v.begin(), v.end(), v.begin(), log(_1) / 0.5);   // produces error
    //std::transform(v.begin(), v.end(), v.begin(), std::log(_1) / 0.5);   // produces error
    //std::transform(v.begin(), v.end(), v.begin(), static_cast<double(*)(double)>(std::log)(_1) / 0.5);   // produces error
}

当我尝试编译代码时,MSVC2010 给出了错误:

Error   1   error C2665: 'log' : none of the 3 overloads could convert all the argument types
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(120): could be 'double log(double)'
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(527): or       'float log(float)'
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\math.h(575): or       'long double log(long double)'
while trying to match the argument list '(boost::lambda::placeholder1_type)'

更新 1: 我不想为它编写函子,认为我必须有十几个函子,然后呢?

更新 2: 我可以使用 C++11 lambda 来做到这一点,但这不是我所要求的

   std::transform(v.begin(), v.end(), v.begin(), [](const double & x) { return log(x) / 0.5; });
4

1 回答 1

2

一个合适的 C++11 Lamba 怎么样?MSVC2010 的支持有限,但简单的数学应该可以正常工作。

std::transform(v.begin(), v.end(), v.begin(), [](const double& x) { return log(x); });

或者一个老派的问题解决方案:

struct f
{
   double operator()(const double& x)
   {
     return log(x);
   }
}
std::transform(v.begin(), v.end(), v.begin(), f);

无论如何,我认为您发布的代码中不需要花哨的 lambda 内容,因为您似乎正在就地修改向量的元素:

std::vector<double> v;
v.push_back(1); v.push_back(2); v.push_back(3);
for(const std::vector<double>::iterator it = v.begin(); it != v.end(); ++it)
{
  /* fancy math stuff here */
  *it = log(*it);
}

恕我直言,这是最干净的方法。我最终的 C++ 解决方案(迄今为止,所有替代方案中最具表现力和最简单的)将是:

for(auto&& x : v)
{
  /* fancy math stuff here */
  x = log(x);
}
于 2013-07-18T14:33:18.887 回答