重载运算符以转置数组

Overload operator to transpose array

本文关键字:数组 转置 运算符 重载      更新时间:2023-10-16

我正在尝试重载运算符~转置给定矩阵:

这是我的代码:

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;
}

e 是指向存储 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;
    }
}

您的代码没有正确填充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是动态分配的,因此还需要析构函数。

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

不访问 thisa 中的大多数元素。仅分别访问元素 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;
}

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

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

编辑

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