如何初始化 2D 向量 C++ [重复]
Posted
技术标签:
【中文标题】如何初始化 2D 向量 C++ [重复]【英文标题】:how to initialize a 2D vector C++ [duplicate] 【发布时间】:2018-03-26 19:00:37 【问题描述】:我是 C++ 的初学者。
我正在尝试自己制作一个 Matrix 课程来训练我。
我在 class Matrix
std::vector<std::vector<long>> m_data;
中声明了 whitch 是一个 2D 向量来存储我的数字。在构造函数中,我想用 2 个参数初始化我的二维数组:NbRows
和 NbCols
。我被困在那里了。
Matrix::Matrix(unsigned int nb_row, unsigned int nb_col)
int i, j;
m_nbRow = nb_row;
m_nbCol = nb_col;
for(i = 0; i < m_nbCol; i ++)
for(j = 0; j <m_nbRow; j ++)
// ?????
【问题讨论】:
矢量没有固定大小。它们根据需要调整大小,通常在使用push_back()
时。如果您想要一个固定的数组大小,请使用std::array
。 en.cppreference.com/w/cpp/container/array
这也是一个使用member initializer list的好地方
这个问题已经被问过很多次了。请在询问之前进行研究,以免我们重复自己。
【参考方案1】:
一个简单的单行解决方案如下:
Matrix(unsigned int nb_row, unsigned int nb_col)
m_data = std::vector<std::vector<long>>(nb_row, std::vector<long>(nb_col,0));
您可以将“0”替换为任何其他数字,具体取决于您希望将矩阵初始化为什么。
【讨论】:
【参考方案2】:您必须在第一个 for
循环之前调整外部向量的大小。
可以调整内部向量的大小,然后分配给它,或者将项目推回给它。
Matrix::Matrix(unsigned int nb_row, unsigned int nb_col)
int i, j;
m_nbRow = nb_row;
m_nbCol = nb_col;
m_data.resize(m_nbCol);
for(i = 0; i < m_nbCol; i ++)
for(j = 0; j <m_nbRow; j ++)
m_data[i].push_back(<some value>);
或
Matrix::Matrix(unsigned int nb_row, unsigned int nb_col)
int i, j;
m_nbRow = nb_row;
m_nbCol = nb_col;
m_data.resize(m_nbCol);
for(i = 0; i < m_nbCol; i ++)
m_data[i].resize(m_nbRow);
for(j = 0; j <m_nbRow; j ++)
m_data[i][j] = <some value>;
如果要将矩阵的元素初始化为零,可以简化为:
Matrix::Matrix(unsigned int nb_row, unsigned int nb_col)
m_nbRow = nb_row;
m_nbCol = nb_col;
m_data.resize(m_nbCol, std::vector<long>(m_nbRow));
附言
通常,矩阵的第一个索引对应于一行,而第二个索引对应于一列。您在帖子中以相反的方式使用它们。我想你是有原因的。
【讨论】:
【参考方案3】:有史以来最短的解决方案:
Matrix(unsigned int nb_row, unsigned int nb_col) : m_nbrow(nb_row), m_nbcol(nb_col),
m_data(nb_row, vector<int>(nb_col))
NB vector
of vector
s 可能不是最好的主意,因为它会创建双重间接,并且它将存储和检查内部矩阵维度大小的冗余副本(即内部 vector
s 的大小),更不用说非顺序布局了。
一种更常见的方法是使用大小为nb_row*nb_col
的vector
和一些常用的索引语法技巧 - index = nb_col*y + x
。
【讨论】:
以上是关于如何初始化 2D 向量 C++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章