繁体   English   中英

的std ::矢量 <float> 和两倍*-这有多安全?

[英]std::vector<float> and double* - How safe is this?

这样安全吗?

double darray[10];
vector<float> fvector;
fvector.insert(fvector.begin(), darray, darray + 10);  // double to float conversion

// now work with fvector

VS2008给我有关双精度浮点转换的警告。 我如何摆脱这个警告? 我认为将darrayfloat*没有意义,因为那样会改变指针的步长(步幅)。

更新:我知道警告指示。 但是与“浮动=双重”不同。 在可以轻松进行强制转换的情况下,在这种情况下,我无法消除警告。

编辑:我已经编辑了代码,以便darray不再是函数参数。 感谢所有指出这一点的人。

使用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());
}

之所以收到警告,是因为您在double精度float转换中失去了精度。 假设您真的需要fvectorvector<float>而不是vector<double> ,那么很明显您可以忍受这种精度损失,因此警告并不重要。

警告是关于没有显式强制转换会丢失有效数字。 您应该收到相同的警告

double d = 1.0;
float f = d;

您可以禁用分配警告(请参阅MSDN中的#pragma警告)。

VS2008给我有关双精度浮点转换的警告。 我如何摆脱这个警告?

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没有意义。 只是被忽略了。 因此最好清楚地记录下来,以使迭代器或指针需要提供对足够多值的访问。

我认为还有另一个问题。 向量空间不足。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM