如何初始化 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 个参数初始化我的二维数组:NbRowsNbCols。我被困在那里了。

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 vectors 可能不是最好的主意,因为它会创建双重间接,并且它将存储和检查内部矩阵维度大小的冗余副本(即内部 vectors 的大小),更不用说非顺序布局了。

一种更常见的方法是使用大小为nb_row*nb_colvector 和一些常用的索引语法技巧 - index = nb_col*y + x

【讨论】:

以上是关于如何初始化 2D 向量 C++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 2D 向量初始化时间

如何在 C++ 中初始化向量 [重复]

我们如何在 C++ 中初始化所有值为 0 的向量 [重复]

如何初始化包含 opencv:matrices 的二维向量?

编译类型向量类的私有成员时出错 - C++ [重复]

如何在 C++ 中使用构造函数初始化二维向量?