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

Visual studio 2010 将向量的元素存储到另一个向量中,visual-studio-2010,performance,visual-c++,vector,2d-vector,Visual Studio 2010,Performance,Visual C++,Vector,2d Vector,我有一个16997*15931*6个元素的向量。您知道,这是GDAL库的RasterIO函数读取的光栅的不同波段。现在我想将元素存储到一个2d向量中,该向量有六个元素(行),每行将包含16997*15931个元素。我知道我可以有一个迭代16997*15931*6的循环,并计算I%6: vector<vector<unsigned char> > bands(6,vector<unsigned char>) for(i=0;i<(6*16997*15931

我有一个16997*15931*6个元素的向量。您知道,这是GDAL库的RasterIO函数读取的光栅的不同波段。现在我想将元素存储到一个2d向量中,该向量有六个元素(行),每行将包含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));  
矢量带(6,矢量)

对于(i=0;i首先,您应该以最大的优化进行编译,并测量当前代码的性能。这也可能取决于您使用的处理器

如果你真的必须改变它,我建议你定义一个6个字符的结构,然后进行结构赋值,你将有一个结构向量,然后你的循环可以是

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

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

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

  • 在循环开始之前调整向量的大小。实际上,向量将随着其增长而调整大小,这将在循环中重复分配、复制和释放。这些操作可能会非常昂贵,而且正如您在开始之前就知道的那样,预分配可以避免开销

  • 通过反复避免相对昂贵的除法,消除循环中的i%6 i端可能会有所帮助