将向量的元素存储到另一个向量中

Posted

技术标签:

【中文标题】将向量的元素存储到另一个向量中【英文标题】:store elements of a vector into another vector 【发布时间】:2013-07-16 10:00:39 【问题描述】:

我有一个包含 16997*15931*6 个元素的向量。您知道这是 GDAL 库的 RasterIO 函数已读取的栅格的不同波段。现在我想将元素存储到具有六个元素(行)的二维向量中,每行将包含 16997*15931 个元素。我知道我可以有一个循环迭代 16997*15931*6 并评估 i%6:

vector<vector<unsigned char> > bands(6,vector<unsigned char>)
for(i=0;i<(6*16997*15931);i++)
   bands[i%6].pushback(data.at(i));  

但由于我使用的是高分辨率 .tiff 图像,因此我需要具有高性能的代码。所以任何更快的算法都会受到欢迎。 谢谢

【问题讨论】:

【参考方案1】:

首先,您应该以最大程度的优化进行编译并测量当前代码的性能。它还可能取决于您使用的处理器。

如果真的要改的话,我建议你定义一个6字符的struct,然后做struct赋值。你将有一个结构向量,然后你的循环可以像

for (i = 0; i < 16997*15931; i++)
    something.pushback(data.at(i));

【讨论】:

【参考方案2】:

在优化算法之前,您需要了解算法慢的地方。一些建议:

调用 something.push_back(data[i]);而不是调用 .at();运算符不检查索引边界,而是 at(),因此速度稍快

在循环开始之前调整向量的大小。实际上,向量将随着它的增长而调整大小,这将通过循环重复分配、复制、释放。这些可能是昂贵的操作,而且您在开始之前就知道大小,预分配可以避免开销

消除循环中的 i%6 I 可能有助于避免一次又一次相对昂贵的除法

【讨论】:

以上是关于将向量的元素存储到另一个向量中的主要内容,如果未能解决你的问题,请参考以下文章

将向量的特定元素广播到另一个向量

将一个向量拆分为几乎相等的子向量,然后存储到另一个向量中

如何将唯一指针从一个向量移动到另一个唯一指针向量? [关闭]

从一类到另一类直接访问存储在向量中的数据

如何在 C++ 中将一个对象从一个向量复制到另一个向量?

C++ 将对象向量中的元素复制到具有此元素的向量中