转置数组

Transposing an array

本文关键字:数组 转置      更新时间:2023-10-16
#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()

其中newMatoldMat属于您实现的MyMatrix