在2d阵列矩阵中移动行

时间:2017-12-11 16:56:08

标签: c++

  

我试图编写一个在c ++中移位行的函数

     

例如

     

1 2 3

4 5 6

7 8 9

  

我想把它换一,所以结果是

7 8 9

1 2 3

4 5 6

  

参数是

 void Matrix:: rowShift(const int   shiftSize){}
  

这是班级

class Matrix {

private:
std::string type;
int row, col;
double **array;


void rowShift(const int shiftSize);
  

这是构造函数

Matrix::Matrix(int rows, int cols, std::string matType) {
type = matType;
row = rows;
col = cols;
array= new double*[row];
for (int i = 0; i < row; ++i)
    array[i] = new double[col];
for (int i = 0; i < rows; i++)
    for (int j = 0; j<cols; j++)
        array[i][j] = 0;
}
  

我想看到的任何想法,我有一个问题,我不习惯语法

1 个答案:

答案 0 :(得分:0)

  

我是C ++的新手,我不习惯语法

首先,如果您不熟悉该语言,在开始编写代码之前,您应该花些时间阅读基础知识。有很多好书可以帮助你入门。我会推荐一些类似于C ++编程的介绍,由该语言的创建者编写。

  

我正在尝试编写一个在C ++中移位行的函数

所以你有一个二维数组(矩阵),你希望将所有行向下移动,旧的底行成为新的顶行。这似乎可能是你的家庭作业转让。这是你的作业吗?如果是,请在将来标记为对自己和他人诚实。我希望你现在停止阅读你对我的问题的答案,去拿那本书并阅读它的封面。一旦这样做回来检查我的答案。

既然您熟悉C ++,我还假设您熟悉标准模板库和容器对象,例如std::vector

  

这是构造函数

现在您已熟悉C ++,您知道可以使用构造函数参数的成员初始化列表。这意味着您不必在构造函数的主体中初始化它们!我将省略您的std::string matType变量,因为它不会在您提供的代码中的任何位置使用。我建议使用嵌套的std::vector来保存矩阵数据而不是C样式数组。 std::vector课程将为您完成所有内存管理(new double[col]没有必要)。在这里,我们将类私有成员变量mMatrix定义为std::vector行和列std::vector< std::vector<double> > mMatrix;

Matrix( const size_t rows,
        const size_t cols ) :
    mRows(rows),
    mCols(cols),
    mMatrix(rows, std::vector<double>(cols)) {
        init();
    }

Matrix::init()函数将使用从1增加到n的默认值填充矩阵。我们使用您在std::iterator上阅读的概念来执行此操作。

void init()
{
    std::vector< std::vector<double> >::iterator row;
    std::vector<double>::iterator col;
    double seedVal(1.0);

    for (row = mMatrix.begin(); row != mMatrix.end(); ++row)
    {
        for (col = row->begin(); col != row->end(); ++col)
        {
            *col = seedVal;
            seedVal++;
        }
    }
}

现在我假设您要打印矩阵的值以验证降档操作是否有效。您可以使用嵌套for循环打印矩阵,这与我们之前初始化值的方式非常相似。这次我们可以使用::const_iterator,因为当我们打印时,我们保证不会修改内容。我们还使用来自#include <iomanip>的{​​{1}}格式标记,例如std::setfill(' ')std::setw(6),以使间距和格式看起来更漂亮。

void print()
{
    std::vector< std::vector<double> >::const_iterator row;
    std::vector<double>::const_iterator col;

    for (row = mMatrix.begin(); row != mMatrix.end(); ++row)
    {
        for (col = row->begin(); col != row->end(); ++col)
        {
            std::cout << std::setfill(' ') << std::setw(6) << *col;
        }
        std::cout << std::endl;
    }
}

现在让我们谈谈你在这里的真正原因。降低整个矩阵的方法(我认为它应该是Matrix类的公共方法,以便任何人都可以访问它)。首先,无论何时移动数组(向量)的内容,都必须在移位的相反方向上循环。在我们的例子中,我们应该在每一行上反转外环的方向。我们也不想覆盖行的内容而不保存之前的内容。我们可以通过一个临时变量实现这一点,你猜对了,我们在移动新值时暂时保留旧值。这是一种方法,只要我们至少有一行可以使用矩阵的所有元素。

void shiftDown()
{
    if (mRows > 0)
    {
        for (size_t i = mRows - 1; i-- > 0; )
        {
            for (size_t j = 0; j < mCols; ++j)
            {
                double temp = mMatrix[i+1][j];
                mMatrix[i+1][j] = mMatrix[i][j];
                mMatrix[i][j] = temp;
            }
        }
    }
}

现在你有一个自包含的Matrix类,它有一个方法可以将每一行向下移动并环绕顶行。对于奖励积分,您可以使用此嵌套循环的变体来实现shiftUp()shiftLeft()shiftRight()等方法。