我尝试使用其他算术运算(不在代码中)将向量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 lambdas做到这一点,但这不是我要求的:
std::transform(v.begin(), v.end(), v.begin(), [](const double & x) { return log(x) / 0.5; });
答案 0 :(得分: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东西,因为你好像在修改了vector的元素:
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);
}