将多维std :: vector转换为多维C数组?

时间:2015-06-28 01:30:17

标签: c++ arrays stdvector

如何将多维std::vector转换为相应的多维C数组?

例如 std::vector<std::vector<int>>int arr[n][m],其中n是外部向量的维度和内部向量的m

2 个答案:

答案 0 :(得分:2)

根据评论中的其他信息,我建议你做一些这样的事情:

class TwoDimVector {
 public:
  TwoDimVector(int num_cols, int num_rows)
      : m_num_cols(num_cols)
      , m_num_rows(num_rows)
      , m_data(m_num_cols * m_num_rows, 0)
  { }

  int & ix(int row, int col) {
     return data[num_cols * row + col];
  }


  const int m_num_rows;
  const int m_num_cols;
 private:
  std::vector<int> m_data;
}

当你进行嵌套向量时,会发生很多额外的工作。此外,对于嵌套向量,数据不是连续的,因此很难使用任何C-apis。请注意,使用此数据结构时,大小在构建时固定且可访问。这被设计为行连续,因此对于C互操作性,您可以访问额外的原始指针,如下所示:

TwoDimVector tdv(4,3);
int * raw = &tdv.ix(0,0);
int * raw_second_row = &tdv.ix(1,0);

请注意:如果将其传递给函数,请务必通过引用传递:

void do_work(TwoDimVector & tdv) {
  ...
}

如果您没有通过引用传递,它将复制所有内容,这是一堆(通常是不必要的)工作。

答案 1 :(得分:0)

也许,这段代码

  void translate(const vector< vector >& vec){

int m = vec.size(), n = 0;

for (vector<int>& deep : vec) // search maximum size if nested vectors
{
    if (deep.size() > n)
        n = deep.size();
}

int arr[m][n];

m = n = 0;
for (vector<int>& deep : vec){
    for (int& x : deep)
    {
        arr[m][n] = x;
        ++n;
    }

    ++m;
}

// So, I really don't know how you can return this array :( }

你看,它代码很糟糕,你不能这样做!!!
如果你用C ++编写,你应该使用std :: vector - 它更容易。 C类阵列是C的遗产,你不应该使用它们