嵌套 std::vector 的等效类矩阵 C 数组是什么?
What is the equivalent matrix-like C-array of a nested std::vector?
什么是嵌套的等效类矩阵 C 数组 std::vector?
例如如果我们想将 std::vector<std::vector<int>>
视为 int arr[n][m]
,其中 n
是外部向量的维度,m
是内部向量的维度?
根据评论中的其他信息,我建议您改为这样做:
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-api。注意这个数据结构,大小在构造时是固定的并且可以访问。这被设计为连续的行,因此对于 C 互操作性,您可以像这样访问额外的原始指针:
TwoDimVector tdv(4,3);
int * raw = &tdv.ix(0,0);
int * raw_second_row = &tdv.ix(1,0);
请注意:如果将 this 传递给函数,请务必按引用传递:
void do_work(TwoDimVector & tdv) {
...
}
如果您不通过引用传递,它将复制所有内容,这是一堆(通常是不必要的)工作。
也许,这段代码
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-like 数组是 C 的遗产,你不应该使用它们
什么是嵌套的等效类矩阵 C 数组 std::vector?
例如如果我们想将 std::vector<std::vector<int>>
视为 int arr[n][m]
,其中 n
是外部向量的维度,m
是内部向量的维度?
根据评论中的其他信息,我建议您改为这样做:
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-api。注意这个数据结构,大小在构造时是固定的并且可以访问。这被设计为连续的行,因此对于 C 互操作性,您可以像这样访问额外的原始指针:
TwoDimVector tdv(4,3);
int * raw = &tdv.ix(0,0);
int * raw_second_row = &tdv.ix(1,0);
请注意:如果将 this 传递给函数,请务必按引用传递:
void do_work(TwoDimVector & tdv) {
...
}
如果您不通过引用传递,它将复制所有内容,这是一堆(通常是不必要的)工作。
也许,这段代码
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-like 数组是 C 的遗产,你不应该使用它们