在我编写的这个程序中,我使用2个矩阵声明为指针指针。最初,矩阵B等于矩阵A,所有的变化都是对矩阵B进行的(我不需要修改A中的值,因为我使用这些值来计算其他东西,如果我直接修改它,我实际上得到了错误的结果)。最后,我需要交换两个矩阵中的值。我的程序已经在运行和编译,但交换了我用过的矩阵
for(i=0;i<n;++i)
for(j=0;j<n;++j)
A[i][j]=B[i][j];
我知道这不是最好的方法,所以我想知道是否有办法通过指针交换我的矩阵。我已经尝试过自己做了。但我是C ++编程的新手,我似乎无法做到这一点:(。
这是我的代码草图:
void swap(int **A, int **B){
?
}
main (){
int **A, **B;
*code*
swap(A,B);
}
答案 0 :(得分:6)
C ++已经为我们提供了a swap
function:
int main()
{
int** A;
int** B;
/* ... code ... */
std::swap(A, B);
}
在这种特殊情况下它的作用基本上是这样的:
void swap(int**& lhs, int**& rhs)
{
int** tmp;
tmp = lhs;
lhs = rhs;
rhs = tmp;
}
或者,使用指针而不是引用:
void swap(int*** lhs, int*** rhs)
{
int** tmp;
tmp = *lhs;
*lhs = *rhs;
*rhs = tmp;
}
通过最后一个,您可以致电swap(&A, &B)
(请注意&
)。
那说,为什么所有这些指针?你是C ++。使用容器。
至少考虑使用真正的数组,因为我严重怀疑类型int**
正在做你认为它正在做的事情。
答案 1 :(得分:1)
看起来这对我来说是一个过滤或管道类型操作所以我建议只是交换指针而不是移动每个元素。
您需要一个中间指针来进行交换,但由于它只是一个指针,因此与矩阵的大小相比,这是一个固定的存储量,因此如果数据集足够大,它应该比复制快得多。
int **A,**B,**tmp;
tmp = A;
A=B;
B=tmp;
如上所述,结构或其他容器可能很有用,特别是如果您进行任何动态内存分配并需要释放它以避免内存泄漏。
答案 2 :(得分:0)
根据您问题的详细说明,似乎“交换”并未真正传达您想要的内容 - 您的for循环会将B
中的值分配给A
中的值。您显然愿意放弃A
中的旧值。接下来的问题是:您是否愿意放弃A
的存储空间?如果是这样,它就像
// Don't forget to deallocate A first, as appropriate to however you allocated A.
A = B;
但是,如果你想反复进行算法,你可能希望保留存储而不是颠覆免费存储。如果您希望下一次迭代从上一次迭代的输出开始(即您希望A和B都保持刚刚计算的矩阵),那么你的for循环就像你可以合理预期的那样快。
如果您希望重新开始使用新数据,那么std::swap(A,B)
就是您想要的。 #include <algorithm>
可以访问它。