Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从数组初始化QVector_C++_Qt_Copy - Fatal编程技术网

C++ 从数组初始化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

我从一个函数接收一个数组作为指针,并想从中初始化一个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(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));
}