2

在我正在编写的这个程序中,我使用了 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);
}
4

3 回答 3

6

C++ already gives us a swap function:

int main()
{
   int** A;
   int** B;

   /* ... code ... */

   std::swap(A, B);   
}

What it does in this particular case is basically this:

void swap(int**& lhs, int**& rhs)
{
   int** tmp;

   tmp = lhs;
   lhs = rhs;
   rhs = tmp;
}

Or, with pointers instead of references:

void swap(int*** lhs, int*** rhs)
{
   int** tmp;

   tmp = *lhs;
   *lhs = *rhs;
   *rhs = tmp;
}

With this last one, you'd call swap(&A, &B) (note the &).

That said, why all these pointers? You're in C++. Use containers.

At the very least consider using real arrays, because I have serious doubts that the type int** is doing what you think it's doing.

于 2012-11-04T18:23:47.103 回答
1

看起来这对我来说是一个过滤或管道类型的操作,所以我建议只是交换指针而不是移动每个元素。

您将需要一个中间指针来进行交换,但由于它只是一个指针,因此与矩阵的大小相比,这是一个固定的存储量,因此如果数据集足够大,它应该比复制快得多。

int **A,**B,**tmp;
tmp = A;
A=B;
B=tmp;

如上所述,结构或其他容器可能很有用,尤其是当您进行任何动态内存分配并需要释放它以避免内存泄漏时。

于 2012-11-04T18:42:40.433 回答
0

从您的问题的详细描述来看,“交换”似乎并没有真正传达您想要的内容 - 您的 for 循环将值分配BA. 您显然愿意丢弃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>访问它。

于 2012-11-04T18:58:49.023 回答