【问题标题】:Vector of vectors to 1D array向量向量到一维数组
【发布时间】:2012-10-18 11:15:09
【问题描述】:

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

【问题讨论】:

  • 这不是您问题的答案,但是您是否尝试过使用单个向量而不是向量的向量?您可以安排模拟二维数组的访问。这样,将向量复制到数组是微不足道的
  • 2D 访问有什么问题:iVector[i][j]
  • @PiotrNycz:没有错,但GPU设备不可能
  • @Manolete - 我明白了 - 我之前忽略了这一点。

标签: c++ stl std stdvector


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      【解决方案4】:

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 2014-06-15
        • 2011-09-03
        • 2017-04-19
        • 2017-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多