[英]Thread safe read from a std::vector of std::tuple of double?
[英]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给我有关双精度浮点转换的警告。 我如何摆脱这个警告? 我认为将darray
为float*
没有意义,因为那样会改变指针的步长(步幅)。
更新:我知道警告指示。 但是与“浮动=双重”不同。 在可以轻松进行强制转换的情况下,在这种情况下,我无法消除警告。
编辑:我已经编辑了代码,以便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
转换中失去了精度。 假设您真的需要fvector
是vector<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.