重载运算符以转置数组

时间:2014-12-06 12:26:28

标签: c++ arrays multidimensional-array

我正在尝试重载操作符〜转置给定矩阵:

这是我的代码:

virtual B operator~()const
{
    B a(column,row);
    for (int i = 0; i<row; i++)
    {
        for (int j = 0; j<column; j++)
        {
            a.e[i] = e[j];
        }
    }
    return a;
}

是指向存储B

的所有整数元素的存储器的指针
int *const e;

但是在输出上我得到了一个由零填充并且大小相同的矩阵。我的意思是如果我转换5x2,我得到相同的5x2由零填充。

编辑: 我的建筑师:

B(int r, int c)
    : row(r), column(c), e(new int[r*c])
{
    for (int i = 0; i < r*c; i++)
    {
        e[i] = 0;
    }
}

3 个答案:

答案 0 :(得分:1)

您的代码未正确填充a.e:它不是转置矩阵,而是覆盖与同一行对应的区域,其中包含不同列的数字。

假设行主要顺序,代码应如下所示:

for (int i = 0; i<row; i++)
{
    for (int j = 0; j<column; j++)
    {
        a.e[j*row+i] = e[i*column+j];
    }
}

由于您提到您的结果填充了零,因此复制构造函数和/或赋值运算符的逻辑可能无法正确编码。请注意,由于B::e是动态分配的,you need a destructor as well

答案 1 :(得分:0)

B a(column,row);
for (int i = 0; i<row; i++)
{
    for (int j = 0; j<column; j++)
    {
        a.e[i] = e[j];
    }
}

不能访问 this a 中的大多数元素。仅访问元素 0 0

归零构造函数没有显示行/列的存储方式,但猜测是

int& B::at(int r, int c){
    return e[r*column + c];
}

替代方案是

    return e[c*row + r];

在这种情况下,您可以通过

进行转置
virtual B operator~()const
{
    B a(column,row);
    for (int i = 0; i<row; i++)
    {
        for (int j = 0; j<column; j++)
        {
            a.at(i, j) = at(j, i); // swap row, column
        }
    }
    return a;
}

答案 2 :(得分:0)

首先,你似乎总是在转置中设置第一个[0..row]元素,原始中每一行的最后一个元素都停在那里。

其次,我不知道B是如何在内部铺设的,但是因为你可以指定矩阵的大小,我推断出用于存储元素的内部数组是在一维中动态分配的缓冲。这意味着您有一个复制构造函数,以避免在方法结束时删除 a 时出现问题。你得到很多0可能意味着(除了你不扫描整个矩阵的事实),你的复制构造函数没有正确实现。

编辑看到您对问题的编辑,我倾向于确定复制构造函数是问题所在。您没有崩溃,因为5x2 = 2x5元素(因此内部缓冲区的大小相同)。