繁体   English   中英

矢量矢量到1D阵列

[英]Vector of vectors to 1D array

我想知道是否有一种聪明的方法可以将矢量中的信息显示为一维数组。 示例:让我们创建一个5x3 int元素向量的向量

vector< vector<int>> iVector;
ivector.resize( 5 );
for(i = 0; i < 5; i++){
    iVector[i].resize(3);
}

但现在我想将这个结构转换为一维数组:

int* myArray = new int[5*3];

所以我可以访问我想要的每个元素如下:

for (i =0;i < 5; i++)
  for(j =0; j< 3; j++)
      myArray[i*3+j] = ...

我知道我可以只按元素将向量复制到数组元素,但我想知道是否有一个方法直接解决向量到数组的转换。 我也知道矢量可以作为iVector[i][j] ,但不幸的是它需要是一个数组,因为它将被发送到GPU并且GPU不理解向量。

只需使用std::copy 5次。

int* ptrArray = myArray;
for (i =0;i < 5; i++) {
  std::copy(iVector[i].begin(), iVector[i].end(), ptrArray);
  ptrArray += iVector[i].size();
}

除了将它复制到数组中之外,你真的无能为力。 GPU不会理解你创建的任何抽象,它不会理解std::vector 你所能做的就是制作一个数组并将其复制。

矢量应该以线性方式存储元素,因此理论上你可以引用整个底层矢量(只有一个矢量):

std::vector<int> numbers;
int data[4] = &(numbers[0]);

同样地,也许你可以尝试相同的2D版本方法。 但是在你的位置我会考虑使用专门设计来处理矩阵的类(很容易编写类似于std :: vector()的类。

或者你可以使用普通的老C.

首先将数组大小初始化为行数*向量向量所具有的列数。 然后使用memcpy将每个向量复制到数组。

vector<vector<int> > v = { {1,2},{3,4},{5,6} }; //v is 3 by 2 matrix 
int *arr = (int*)malloc( (3*2) * sizeof(int)); // arr has size 3*2 = 6
for (int i = 0; i < 3; i++)
    memcpy(arr + v[i].size() * i, &(v[i][0]), v[i].size() * sizeof(int));

这是我写的一个函数,它为你做了这个:

template<typename T>
T *vectorToArray(vector<vector<T> > const &v) {
    T *rv = (T*)malloc((v.size()*v[0].size()) * sizeof(T)); //Assuming all rows have the same size
    for (unsigned i = 0; i < v.size(); i++)
        memcpy(rv + v[i].size() * i, &(v[i][0]), v[i].size() * sizeof(T));
    return rv;
}

所以现在你可以这样做:

vector<vector<int> > v = { {1,2},{3,4},{5,6} }; //v is 3 by 2 matrix 
int *arr = vectorToArray(v);

我希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM