【发布时间】:2021-02-14 00:31:39
【问题描述】:
这个问题很简单。经过一些试验,这是我发现的最有效的代码:
//For the sake of the example, I initialize every entry as zero.
vector<float> vector1D(1024 * 768, 0);
vector<vector<float>> vector2D(768, vector<float>(1024,0));
int counter = 0;
for (int i = 0; i < 768; i++) {
for (int j = 0; j < 1024; j++) {
vector2D[i][j] = vector1D[counter++];
}
}
有没有更快的方法?
【问题讨论】:
-
一种非常有效的方法是创建一个视图,该视图提供二维向量的接口,同时仍然是一维向量。
-
您可以尝试
std::copy而不是内部循环for (int j = 0; j < 1024; j++) {,编译器可能能够生成代码,从而更有效地一步复制1024 个元素。但是你确定你真的想要一个vector<vector<float>>吗?通常,您希望处理存储在这样一个矩阵中的数据,然后将这些数据持续存储在内存中,这在大多数情况下会更有效。 -
@MA 注意。我会调查一下,因为我以前从未听说过意见。
-
如果你真的需要复制数据,我认为你这样做的方式是最好的。如果您想要的是能够像访问二维数组一样方便地访问数据,您可以创建一个重载
operator[]并返回std::span的包装类(如果您使用的是 c++17)或只是一个指针。 -
vector2D[i][j]类似于vector2D.ptr_to_data[i].ptr_to_data[j],内存不一定连续在内存中。这可能会导致缓存未命中并且比vector1D[j+i*1024]慢。大多数对矩阵进行大量计算的库都将它们连续存储在内存中。与vector1D[j+i*1024]相比,vector2D[i][j]这样的东西看起来更简单,但这并不意味着它更高效。
标签: c++ for-loop vector 2d-vector