【发布时间】:2017-06-18 05:02:15
【问题描述】:
我有一个 50 x 50 矩阵 arr[50][50],需要交换子数组 arr[0] 和 arr[1] 中的值。
即,每个子数组中的全部 50 个元素需要交换。
我能想到的唯一方法是使用如下循环:
for(i=0; i<50; ++i)
{
int t = arr[0][i];
arr[0][i] = arr[1][i];
arr[1][i] = t;
}
我想知道是否有更简单或更短的方法?可以使用指针吗?
我尝试过类似
int *t = arr[0];
arr[0] = arr[1];
arr[1] = t;
但它在第一行给出了关于“从类型'int *'分配给类型'int [2]'时不兼容的类型”的错误。
然后我尝试了指向数组的指针
int (*t)[50] = arr[0];
arr[0] = arr[1];
arr[1] = t;
这一次我在第二行得到了关于“从类型'int *'分配给类型'int [50]'时不兼容的类型”的错误。
【问题讨论】:
-
嗯,一种更快的方法是使用异或表达式而不是使用第三个变量 -
arr[0][i] = arr[0][i]^arr[1][i]; arr[1][i] = arr[0][i]^arr[1][i]; arr[0][i] = arr[0][i]^arr[1][i];,复杂性相同,但常数因素会发生变化。 -
使用
=复制数据的唯一方法是从简单变量、单个数组元素或struct。考虑使用int temp[50]和memcpy。 -
@GAURANG VYAS:完全相反。 faster 方法是不混淆代码并帮助编译器确定您只想交换两个值。您的 XOR 技巧是一个臭名昭著的反模式,必须避免。
-
@GAURANGVYAS OP 的交换循环在每次迭代中执行 3 次读取和 3 次写入(
i除外),但您的方式执行 6 次读取和 3 次写入。 -
@GAURANG VYAS:与第三个变量的简单交换将立即被体面的编译器识别为交换操作。编译器将能够以最有效的方式实现它:可能是一条 XCHNG 指令,甚至可能是您的 XOR 技巧,也可能是其他东西。编译器更擅长这种微优化。同时,您的 XOR 技巧可能只会混淆编译器并阻碍这些优化。