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

标签 c++ arrays

我正在尝试转置矩阵,如下所示。我通过引用传递数组,但不知何故它不起作用(AFTER 与 BEFORE 相同)。我不确定为什么。

但是,真正令我惊讶的是,即使在 transpose() 函数内部,数组也没有转置(INSIDE 怎么和 BEFORE 一样??)。我错过了什么?

#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);
}

输出:

$ ./a.out
BEFORE:
 1       2       3       4
 5       6       7       8
 9      10      11      12
13      14      15      16

INSIDE:
 1       2       3       4
 5       6       7       8
 9      10      11      12
13      14      15      16

AFTER:
 1       2       3       4
 5       6       7       8
 9      10      11      12
13      14      15      16
$

最佳答案

您是否可能将其移调两次:

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;
    }
}

即将 src(i,j) 替换为 src(j,i)... 然后将 src(j,i) 替换为 src(i,j)?

关于c++ - 我的转置函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10861289/

相关文章:

python - 从 x,y 坐标查找最近的 x,y,z 点

go - Golang 中二进制字节数组的终止指示器?

php - 检查数组中是否存在对象

objective-c - 从在 ARC 下包装第 3 方 C++ 对象的类返回 C 样式数组是否安全?

javascript - 当另一个文件中的值更改时,全局变量不会更新nodejs

c++ - 关于文字类型,无符号负数

c++ - 如果 constexpr 格式正确,这是在内部使用 static_assert 吗?

c++ - C++ 中零初始化值的 float 比较

c++ - 如何在 lambda 表达式中传递变量?

c++ - 显示与main.cpp不同的类