【发布时间】:2020-10-04 14:20:35
【问题描述】:
我正在处理大量数据,例如 100,000 个双精度值,每 100 毫秒左右收集一次。在任何给定时间,我都必须在我的软件中存储 25 个甚至更多这些生成的数据。两者,每次采集的数据长度以及采集次数都因当前情况而异。我不想将我的数据存储为QVector<QVector<double>>,因为QVector 将数据存储在相邻的内存位置,并且每次将QVector<double> 添加到QVector<QVector<double>> 都会导致整个内容被复制到给定的新位置,从而导致巨大的滞后(特别是如果已经有 20 个QVector<double> 存在并且我正在添加第 21 个)。
我的解决方案是将给定数据存储为QVector<QVector<double>*>,即每次数据采集我只是将地址存储到QVector 以进行当前采集。但是,我希望它独立存储在QVector<QVector<double>*> 中,即只要我不清除指针,我就可以访问数据。我无法弄清楚如何做到这一点。我尝试了多种方法。假设我在我的 .h 文件中声明 QVector<QVector<double>*> myVec; 并使用一个函数在每次采集时向其添加新数据(以下函数仅用于测试,这就是我在其中创建数据的原因函数):
void MainWindow::addData()
{
myVec << &QVector<double>(0) // Creating a new empty vector and storing it's location
*myVec[0] << 2.7 << 3.4 << 4.5;
}
这不起作用,大多数时候它会抛出异常,有几次它只是显示一些垃圾值。
void MainWindow::addData()
{
QVector<double> tempVec; // Create a temprory vector
tempVec << 2.7 << 3.4 << 4.5;
myVec << &tempVec;
}
当然,这也不起作用,因为一旦退出 addData(),tempVec 就会被销毁。
void MainWindow::addData()
{
QVector<double> tempVec; // Create a temprory vector
tempVec << 2.7 << 3.4 << 4.5;
myVec << &QVector(tempVec);
}
我认为这会起作用,因为我没有存储tempVec 的地址,而是将tempVec 复制到一个新的QVector 并将其地址分配给myVec,但它也会引发异常。
有什么方法可以将QVector 纯粹作为指针 存储在另一个QVector 中?
【问题讨论】:
-
不,对向量的每次添加都不会导致重新分配。一个相当聪明的算法会导致在恒定摊销时间内发生重新分配。
-
调整 QV 的 QV 大小不会复制所有数据,它只是移动指针。别的东西是你的问题。可能你在复制QV?不要。
-
@Yakk - Adam Nevraumont 谢谢!是的,我正在将 QV 从我的数据源复制到我的计算算法中,因为我希望它们中的每一个都能够彼此独立地运行。
-
@Chaitanya 移动它而不是复制它?还是您需要它的两个逻辑副本?
-
@Chaitanya 它存储为指针,但如果你复制它可能会重复。