矢量矢量到1D阵列

时间:2012-10-18 11:15:09

标签: c++ stl std stdvector

我想知道是否有一种聪明的方法可以将矢量中的信息显示为一维数组。例: 让我们创建一个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却不理解向量。

4 个答案:

答案 0 :(得分:2)

只需使用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();
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

或者您可以使用普通的旧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);

我希望这会有所帮助