举个例子:
#include <vector>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
void PrintVec(const std::vector<float>&);
int main(int argc, char * argv[]){
float vals[] = {-1.2,0.0,1.2};
std::vector<float> test(vals, vals + sizeof(vals) / sizeof(float));
std::vector<float> absTest(3);
std::transform(test.begin(), test.end(), absTest.begin(), std::abs<float>());
PrintVec(test);
PrintVec(absTest);
return 0;
}
void PrintVec(const std::vector<float> &vec){
for (unsigned int i = 0; i < vec.size(); ++i){
std::cout << vec[i] << '\n';
}
return;
}
同时使用gcc 4.3.4和VS 2013会出现编译器错误。对于gcc:
testTransformAbs.cpp:15:错误:“浮动”之前的预期主表达式
对于VS 2013,其:
错误C2062:意外键入“浮动”
如果删除,<float>
则会出现此错误:
testTransformAbs.cpp:15:错误:没有匹配的函数可调用'abs()'/usr/include/stdlib.h:766:注意:候选对象是:int abs(int)/usr/include/c++/4.3/cstdlib :144:注意:long int std :: abs(long int)/usr/include/c++/4.3/cstdlib:175:注意:long long int __gnu_cxx :: abs(long long int)/usr/include/c++/4.3 / cmath:99:注意:double std :: abs(double)/usr/include/c++/4.3/cmath:103:注意:float std :: abs(float)/usr/include/c++/4.3/cmath:107 :注意:long double std :: abs(long double)
我可以创建自己的功能
float MyAbs(float f){
return sqrt(f * f);
}
std::transform(test.begin(), test.end(), absTest.begin(), MyAbs);
一切正常。cplusplus.com上的参考资料说,第四个输入可以是UnaryOperation,其定义如下:
一元函数,将InputIterator指向的类型的一个元素作为参数,并返回一些可转换为OutputIterator指向的类型的结果值。这可以是一个函数指针或一个函数对象。
对我来说这应该可以使用std::abs()
。我也尝试fabs
了相同的结果。我想念什么?
std::abs
是重载函数,而不是模板函数。获取指向函数的指针时,可以通过强制转换来选择特定的重载:
std::transform(test.begin(), test.end(), absTest.begin(),
static_cast<float (*)(float)>(&std::abs));
或使用函数指针变量:
float (*fabs)(float) = &std::abs;
std::transform(test.begin(), test.end(), absTest.begin(), fabs);
请注意,我还删除了()
您放在after之后的内容abs
,因为这是一个函数,而不是需要实例化的类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句