【问题标题】:square-root and square of vector doubles in C++C ++中向量的平方根和平方双打
【发布时间】:2010-07-20 14:53:44
【问题描述】:

我想计算双精度向量的平方和平方根。例如给出:

 vector<double> Array1(10,2.0); 
 vector<double> Array2(10,2.0); 

 for(unsigned int i=0; i<Array1.size(); i++)
     Array1[i] = sqrt(Array1[i]);

 for(unsigned int i=0; i<Array2.size(); i++)
     Array2[i] = Array2[i] * Array2[i]; 

有没有办法使用 STL 函数(如 transform)来完成上述操作?也许 有一个作用于数组的内置 sqrt 函数吗?

【问题讨论】:

  • 你总是可以创建一个函数,它接受一个向量或指针并对其进行所需的操作。 :-)
  • Perform vector operation 的可能重复项

标签: c++ vector stl square-root exponent


【解决方案1】:

your previous question相同的答案...

static inline double computeSquare (double x) { return x*x; }

...

std::transform(Array1.begin(), Array1.end(), Array1.begin(), (double(*)(double)) sqrt);
std::transform(Array2.begin(), Array2.end(), Array2.begin(), computeSquare);

(double(*)(double)) 强制转换是强制 sqrt 函数使用 double 变体 - 这是一个重载函数。您可以使用 std::ptr_fun&lt;double, double&gt;(sqrt) 来避免转换。)

【讨论】:

  • 抛开问题:ptr_fun(sqrt&lt;double&gt;) 是否可移植而不是丑陋的演员表?我记得编译器经常阻塞指向&lt;cmath&gt; 重载函数的指针。
  • @Alex: std::ptr_fun&lt;double, double&gt;(sqrt),但我不认为它更漂亮。
  • 如果我们使用sqrt&lt;double&gt;,是不是没有模板扣减?
  • @Alex:error: no matching function for call to ‘ptr_fun(&lt;unresolved overloaded function type&gt;)’。 (sqrt 是重载的,不是模板化的。我什至不认为sqrt&lt;double&gt; 是有效的。)
【解决方案2】:

认为第二个transform 可以简化,我只是不确定如何。

#include <algorithm>
using namespace std;

vector<double> Array1(10,2.0); 
vector<double> Array2(10,2.0); 

transform( Array1.begin(), Array1.end(), Array1.begin(), sqrt );
transform( Array2.begin(), Array2.end(), Array2.begin(), Array2.begin(), multiplies<double>() );

【讨论】:

  • 我觉得第二个transform很简单。
【解决方案3】:

如果你的编译器支持 C++0x,KennyTM's answer 可以稍微调整一下:

std::transform(Array1.begin(), Array1.end(), Array1.begin(), [](double f)->double { return f * f; });

或者,如果您使用的是 Boost,则可以使用 Boost::lambda:

#include <boost/lambda.hpp>
using namespace boost::lambda;

std::transform(Array1.begin(), Array1.end(), Array1.begin(), _1 * _1);

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多