5

我想知道是否有一种巧妙的方法可以将向量中的信息呈现为一维数组。示例:让我们创建一个由 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

4 回答 4

2

只需使用std::copy5 次。

int* ptrArray = myArray;
for (i =0;i < 5; i++) {
  std::copy(iVector[i].begin(), iVector[i].end(), ptrArray);
  ptrArray += iVector[i].size();
}
于 2012-10-18T11:32:52.023 回答
2

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

于 2012-10-18T11:35:24.973 回答
1

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

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

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

于 2012-10-18T11:31:54.730 回答
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);

我希望这有帮助

于 2017-03-31T20:01:17.127 回答