C++ 从数组初始化QVector
我从一个函数接收一个数组作为指针,并想从中初始化一个QVector 现在我是这样做的:C++ 从数组初始化QVector,c++,qt,copy,C++,Qt,Copy,我从一个函数接收一个数组作为指针,并想从中初始化一个QVector 现在我是这样做的: void foo(double* receivedArray, size_t size) { QVector<double> vec(size); std::copy(receivedArray, receivedArray + size, std::begin(vec)); } void foo(双*接收阵列,大小) { qvec(大小); std::copy(receive
void foo(double* receivedArray, size_t size)
{
QVector<double> vec(size);
std::copy(receivedArray, receivedArray + size, std::begin(vec));
}
void foo(双*接收阵列,大小)
{
qvec(大小);
std::copy(receivedArray,receivedArray+大小,std::begin(vec));
}
这样做是否同样可行:
void foo(double* receivedArray, size_t size)
{
QVector<double> vec(size);
vec.data() = receivedArray;
}
void foo(双*接收阵列,大小)
{
qvec(大小);
vec.data()=接收数据;
}
这会破坏我不知道的某种Qt机制吗?不会返回对底层指针的引用,因此您无法将其分配给vec.data()
(它不是左值,甚至不会编译):
模板
结构向量{
T*数据;
T*nref_数据(){返回数据}
T*&ref_data(){返回数据}
};
向量向量机;
vec.ref_data()=新整数[100];//好的,Vector::ref_数据返回一个引用
vec.nref_data()=新整数[100];//Nok,Vector::nref_数据不返回引用
第一个做了不必要的工作,在填充向量之前用默认构造的双精度对向量进行初始化。不幸的是,QVector缺少范围插入,因此您必须求助于算法:
void foo(double* receivedArray, size_t size)
{
QVector<double> vec;
vec.reserve(size); // warning: size_t->int cast
std::copy(receivedArray, receivedArray + size, std::back_inserter(vec));
}
void foo(双*接收阵列,大小)
{
qvec;
vec.reserve(size);//警告:size\u t->int cast
标准::复制(接收数据集,接收数据集+大小,标准::返回插入器(vec));
}
第二个版本甚至不编译,因为
data()
返回一个T*
,这是一个不能放在赋值左边的右值。不是答案,但如果foo
接收一个std::向量的double,而不是指针和大小,则会更容易、更容易证明错误,例如void foo(const std::vector&receivedArray){…}
。在这种情况下,您只需要QVector::fromStdVector
。同意,但这不取决于我。这实际上是QVector的重点。我不得不接受一个大小为t的浮点*值,因为它来自另一个API,并且希望在我的程序中使用更高级的类型。我在保留和返回inser方面遇到了一个奇怪的问题ter.我必须在GB范围内的相当大的数组中多次执行上述函数。我观察到QVector::reserve后跟QVector::resize,然后是一个简单的复制via,迭代器表现得更快(大约50%)比back_inserter版本快。您还记得类似的行为吗?@FreddyKay是的,在这种特定情况下使用您的版本可能更快,原因有两个:1)使用0
初始化std::vector
很快,因为您只需要执行std::memset(data(),0,size()*sizeof(double))
(在大多数架构上)使用std::memcpy(data(),src,size()*sizeof(double))
复制平凡类型也非常快。编译器知道如何优化std::vector
和std::copy
这类普通类型,例如double
,另一方面,使用std::back\u插入器是很难优化的。@FreddyKay还注意到QVector()
可能预先分配了一些容量,所以如果以后保留,您需要先取消分配,然后再重新分配。由于涉及COW,QVector()
实际上并不预先分配任何内容。然后,是的,你需要衡量你在做什么back\u inserter
无疑是更通用的解决方案。
void foo(double* receivedArray, size_t size)
{
QVector<double> vec;
vec.reserve(size); // warning: size_t->int cast
std::copy(receivedArray, receivedArray + size, std::back_inserter(vec));
}