转置数组
Transposing an array
#include<iostream>
using namespace std;
void transpose(const int input[2][3], int (&output)[3][2]){
for(int i=0; i<2; ++i) {
for(int j=0; j<3 ; ++j) {
output [j][i] = input [i][j];
}
}
}
void printMultiArray(const int multi[2][3], const int len){
for (int row=0; row<2; row++){
for (int col=0; col<3; col++){
cout << multi[row][col] << " " ;
}
cout << endl;
}
}
int main(){
int multi[2][3] = {{1, 2, 3}, {7, 8, 9}};
int empty[3][2];
printMultiArray(multi, 6);
cout << "... space line ..." << endl;
transpose(multi, empty);
printMultiArray(empty, 6);
return 0;
}
我有上面的代码来转置 2x3 数组......但它不会编译并失败,并显示:
6-3-transposeArray.cpp: In function ‘int main()’:
6-3-transposeArray.cpp:33: error: cannot convert ‘int (*)[2]’ to ‘const int (*)[3]’ for argument ‘1’ to ‘void printMultiArray(const int (*)[3], int)’
不过,我不确定问题是什么。它似乎在抱怨第一个 arg 来转置((,但 printMultiArray(( 似乎对以相同方式传递数组没有问题。
其次,是否有更通用的方法来实现这一点?(例如,一个通用函数,可以接受 2x3、2x4 和 2x5 数组并返回每个数组的转置(
有点基本的问题,但任何帮助都表示赞赏:)
它似乎在抱怨第一个参数来转置((
不,错误清楚地表明问题出在要printMultiArray
的第一个参数上。您正在传递一个 3x2 数组,并且该函数是针对 2x3 数组硬编码的。
其次,是否有更通用的方法来实现这一点?
是;可以使用整数模板参数来指定维度:
template <size_t N, size_t M>
void transpose(const int (&input)[N][M], int (&output)[M][N]) {
for (size_t i = 0; i < N; ++i) {
for (size_t j = 0; j < M; ++j) {
output[j][i] = input[i][j];
}
}
}
正确的模板专用化可以从函数参数中推导出来:
transpose(multi, empty); // Automatically selects N=2, M=3.
同样,您可以实现通用printMultiArray
来修复错误。
创建一个包含向量的类。在构造函数中传递矩阵的 x 和 y 大小,并将向量大小调整为 x * y。创建获取/设置函数(或运算符 [](,这些函数采用用户希望访问的 x、y 坐标。在类中也有一个"转置"布尔标志。如果标志为 true,则交换 x 和 y,然后返回 vec[x + y * sizex]。现在转置数组不需要任何复制。只需翻转旗帜。
您可以使用
std::vectors
实现这些,它将更具可读性和可管理性。
但是如果你想要一些通用的东西,我会使用本征。 如果你坚持实现自己,并且你想要一些通用的东西,我会为你构建一个类来做到这一点。 我不会过多地讨论设计,但它可能是这样的
newMat = oldMat.Transpose()
其中newMat
和oldMat
属于您实现的MyMatrix
类
相关文章:
- 如何从 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 数组重置为零:最快的方法
- 转置数组
- 将一维字节数组转置为二维数组