#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到transpose()但是printMultiArray()似乎没有问题,数组以相同的方式传递。
其次是否有更通用的方法来实现它? (例如,可以接收2x3,2x4和2x5数组并返回每个转置的通用函数)
基本问题,但任何帮助赞赏:)
答案 0 :(得分:3)
似乎抱怨第一个arg要转置()
不,错误清楚地表明问题出在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
来修复错误。
答案 1 :(得分:0)
创建一个包含矢量的类。在构造函数中传递矩阵的x和y大小,并将向量的大小调整为x * y。创建获取/设置函数(或operator []),其中包含用户希望访问的x,y坐标。在课堂上还有一个“转置”bool标志。如果该标志为true,则交换x和y,然后返回vec [x + y * sizex]。现在转置数组不需要任何复制。只需翻转旗帜。
答案 2 :(得分:0)
您可以使用std::vectors
来实现这些功能,并且它更具可读性和可管理性。
但是如果你想要一些通用的东西,我会使用Eigen。如果你坚持自己实现并且想要一些通用的东西,我会建立一个为你做这个的类。我不会过多地介绍设计,但它可能类似于
newMat = oldMat.Transpose()
其中newMat
和oldMat
属于您实施的MyMatrix
类