【问题标题】:how to initialize a 2D vector C++ [duplicate]如何初始化 2D 向量 C++ [重复]
【发布时间】: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::arrayen.cppreference.com/w/cpp/container/array
  • 这也是一个使用member initializer list的好地方
  • 这个问题已经被问过很多次了。请在询问之前进行研究,以免我们重复自己。

标签: c++ class vector


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-12
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多