这样做是否安全?
double darray[10];
vector<float> fvector;
fvector.insert(fvector.begin(), darray, darray + 10); // double to float conversion
// now work with fvector
VS2008给我一个关于double to float转换的警告。我如何摆脱这个警告?我认为将darray
强制转换为float*
是不合理的,因为这会改变指针的步长(步幅)。
更新:我知道警告指示的内容。但不像“漂浮=加倍”;在我可以轻松应用演员阵容的情况下,我无法在这种情况下消除警告。
编辑:我编辑了代码,以便darray
不再是函数参数。感谢所有指出的人。
答案 0 :(得分:4)
使用std :: transform(),这允许您提供转换方法 那么你只需要一个不会产生警告的转换方法:
#include <vector>
#include <algorithm>
#include <iterator>
struct CastToFloat
{
float operator()(double value) const { return static_cast<float>(value);}
};
int main()
{
double data[] = { 1, 2,3,4,5,6,7,8,9,10};
std::vector<float> fl;
std::transform(data, data+10,
std::back_inserter(fl),
CastToFloat());
}
答案 1 :(得分:3)
您收到警告是因为您在double
到float
转换中失去了精确度,这就是全部。假设您确实需要fvector
成为vector<float>
而不是vector<double>
,很明显您可以忍受这种精确损失,因此警告并不重要。
答案 2 :(得分:1)
警告是关于没有显式强制转换的有效数字丢失。你应该得到
的相同警告double d = 1.0;
float f = d;
您可以禁用分配警告(请参阅MSDN中的#pragma警告)。
答案 3 :(得分:0)
VS2008给我一个关于double to float转换的警告。我如何摆脱这个警告?
void some_function(double *darray){
vector<double> fvector;
fvector.insert(fvector.begin(), darray, darray + 10);
}
或者
void some_function(float *darray){
vector<float> fvector;
fvector.insert(fvector.begin(), darray, darray + 10);
}
或者使用两种变体重载您的函数,或将其设为模板
template<typename RandomAccessIterator>
void some_function(RandomAccessIterator it){
typedef typename iterator_traits<RandomAccessIterator>::value_type value_type;
vector<value_type> fvector(it, it + 10);
}
当然,假设一个固定的10
并不是一个好主意。请注意,原始代码都不安全,因为函数参数列表中的10
没有意义。它完全被忽略了。因此,更好地将其清楚地记录下来,迭代器或指针需要提供对足够多的值的访问。
答案 4 :(得分:-2)
在我看来还有另一个问题。矢量没有足够的空间......