重载运算符以转置数组
Overload operator to transpose 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;
}
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];
}
}
不访问 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;
}
首先,您似乎总是在转置中设置第一个 [0..row] 元素,最后一个元素在原文的每一行上并停在那里。
其次,我不知道 B 是如何在内部铺设的,但由于您可以指定矩阵的大小,因此我推断用于存储元素的内部数组是在一维缓冲区中动态分配的。这意味着您有一个复制构造函数,以避免在方法末尾删除 的问题。你得到很多0可能意味着(除了你不扫描整个矩阵的事实),你的复制构造函数没有正确实现。
编辑看到您对问题的编辑,我倾向于确定复制构造函数是问题所在。您不会崩溃,因为 5x2 = 2x5 元素(因此内部缓冲区的大小相同)。
相关文章:
- 如何从 c++ 中类中内置的数组继承
- C++快速将 int 数组内容转储到文本文件中
- 使用递归的序列到达数组末尾的最小跳转次数
- 将 Lora.read() 转储到数组
- 将 std::unique_ptr 重置为指向数组的指针有什么问题?
- 如何在运行时阻止数组重置
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 由于 C++17 支持数组shared_ptr,这是否意味着在 ctor 和重置中不再需要 T[] 的显式删除器?
- const(但不是constexpr)用作内置数组大小
- 数组的转置和乘法
- 如何在结构C++初始化内置数组
- 排序后如何将二维数组重置为原始形式
- C 将解析器的结果转到数组
- 从数组中删除元素,而无需在 c++ 中内置任何函数
- 重载运算符以转置数组
- 将C++数组转储到具有特定endianness的文件中
- C++将数组重置为null
- 将 C int 数组重置为零:最快的方法
- 转置数组
- 将一维字节数组转置为二维数组