std :: vector <float>和double * - 这有多安全?</float>

时间:2010-07-09 07:52:26

标签: c++ stl floating-point warnings double

这样做是否安全?

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不再是函数参数。感谢所有指出的人。

5 个答案:

答案 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)

您收到警告是因为您在doublefloat转换中失去了精确度,这就是全部。假设您确实需要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)

在我看来还有另一个问题。矢量没有足够的空间......