转置数组

时间:2013-07-16 16:06:12

标签: c++

#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数组并返回每个转置的通用函数)

基本问题,但任何帮助赞赏:)

3 个答案:

答案 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()

其中newMatoldMat属于您实施的MyMatrix