具有cmath函数的stl方法

时间:2010-08-04 00:03:37

标签: c++ stl

我试图编写一个STL方法来获取向量的日志:

for_each(vec.begin(),vec.end(),log);

但是我得到了

no matching function for call to ‘for_each(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, <unresolved overloaded function type>)’

我收集的是由于日志功能的多个版本。显然我可以在日志函数周围编写一个简单的包装器并用它调用它。有没有更简单的方法来指定我想要内联的日志功能?

2 个答案:

答案 0 :(得分:8)

是。您可以将函数转换为适当的类型:

for_each(vec.begin(),vec.end(),(double(*)(double))log);

另一种可能性是创建可接受任何类型的仿函数:

struct log_f
{
  template <class T> T operator()(const T& t) const { return log(t); }
};

for_each(vec.begin(),vec.end(), log_f());

而且,正如比利奥尼尔指出的那样,你想要transform而不是for_each

答案 1 :(得分:2)

我相信std::for_each正在寻找一个具有void返回类型的函数。你正在传递一个双返回类型的函数。 jpalecek的答案是正确的,而+1给他。但是,您仍然存在语法问题,即使用日志执行for_each没有任何意义:

如果您希望向量的所有成员都是先前成员的日志,即:

//pseudocode
foreach( var x in myvector )
   x = log(x);

然后你不想要for_each,你需要transform

std::transform(vec.begin(), vec.end(), vec.begin(), log);