2010-07-20 74 views
0

我想計算雙精度矢量的平方和平方根。例如:平方根和向量的平方在C++中雙打

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函數作用於數組?

+0

你總是可以創建一個接受向量或指針的函數,並對其進行所需的操作。 :-) – corsiKa 2010-07-20 14:56:38

+0

[執行矢量操作]的可能副本(http://stackoverflow.com/questions/3280541/perform-vector-operation) – 2010-07-20 15:16:54

回答

7

相同的答案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<double, double>(sqrt)避免投。)

+0

Aside question:does'ptr_fun(sqrt )'portable工作,而不是醜陋的演員?我記得編譯器經常扼殺''超載函數的指針。 – 2010-07-20 17:24:59

+0

@Alex:'std :: ptr_fun (sqrt)',但我認爲它不太漂亮。 – kennytm 2010-07-20 17:33:02

+0

如果我們使用'sqrt ''沒有模板扣除? – 2010-07-20 17:40:07

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>()); 
+0

我認爲第二個'transform'很簡單。 – kennytm 2010-07-20 15:17:59

2

如果你的編譯器的C++ 0x的支持,KennyTM's answer可以調整一點點:

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

或者如果你使用Boost,可以使用的boost ::拉姆達:

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

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