C++ 我的转置函数有什么问题?

C++ 我的转置函数有什么问题?,c++,arrays,C++,Arrays,我正在尝试转换矩阵,如下所示。我通过引用传递数组,但不知何故它不起作用(之后与之前相同)。我不知道为什么 但是,我真正感到惊讶的是,即使在transpose()函数中,数组也没有被转置(内部怎么可能与以前相同??)。我错过了什么 #include <iostream> template <int M, int N> void print1(int (&src)[M][N]) { for(int i = 0; i < M; i++) {

我正在尝试转换矩阵,如下所示。我通过引用传递数组,但不知何故它不起作用(之后与之前相同)。我不知道为什么

但是,我真正感到惊讶的是,即使在
transpose()
函数中,数组也没有被转置(内部怎么可能与以前相同??)。我错过了什么

#include <iostream>

template <int M, int N>
void print1(int (&src)[M][N]) {
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++)
            printf("%2d\t", src[i][j]);
        std::cout << std::endl;
    }
}

template <int M, int N>
void transpose(int (&src)[M][N]) {
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++) {
            if (i == j) continue;
            int temp = src[i][j];
            src[i][j] = src[j][i];
            src[j][i] = temp;
        }
    }
    std::cout << "\nINSIDE:\n";
    print1(src);
}

int main() {

    int src[][4] = {
        { 1,  2,  3,  4},
        { 5,  6,  7,  8},
        { 9, 10, 11, 12},
        {13, 14, 15, 16},
    };

    std::cout << "BEFORE:\n";
    print1(src);
    transpose(src);

    std::cout << "\nAFTER:\n";
    print1(src);
}

您是否可能将其转置两次:

for(int i = 0; i < M; i++) {
    for(int j = 0; j < N; j++) {
        if (i == j) continue;
        int temp = src[i][j];
        src[i][j] = src[j][i];
        src[j][i] = temp;
    }
}
for(int i=0;i

i、 e.用
src(i,j)
代替
src(j,i)
。。。然后用
src(j,i)
代替
src(i,j)

是一个更好的优化

for(int i = 0; i < M; i++) {
    for(int j = 0; j < i; j++) { <----------------  Compare j with i and not with N
        // if (i == j) continue;    <----------------  No need to do this extra check
        int temp = src[i][j];
        src[i][j] = src[j][i];
        src[j][i] = temp;
    }
}
for(int i=0;i对于(int j=0;jsrc[1][2]
src[2][1]
交换,之后的
src[2][1]
src[1][2]
交换。更改循环条件以在
i时跳过交换。您也可以使用
std::swap(src[i][j],src[i]));
在不声明临时变量的情况下交换值。你修改了你的问题吗?一年后来看你的人永远不会知道你在那里做了什么!加上转置只为平方矩阵定义,所以只使用单个模板参数。不,我不修改。你认为我为什么这么做?
for(int i = 0; i < M; i++) {
    for(int j = 0; j < i; j++) { <----------------  Compare j with i and not with N
        // if (i == j) continue;    <----------------  No need to do this extra check
        int temp = src[i][j];
        src[i][j] = src[j][i];
        src[j][i] = temp;
    }
}