2

私が書いているこのプログラムでは、ポインタからポインタへのポインタとして宣言された 2 つの行列を使用しています。最初は、行列 B は行列 A と等しく、すべての変更は行列 B に対して行われています (これらの値を使用して何か他のものを計算しているため、A の値を変更する必要はありません。直接変更すると、実際には間違った結果)。最後に、2 つの行列の値を交換する必要があります。私のプログラムはすでに実行され、コンパイルされていますが、使用した行列を交換するには

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 ++はすでに関数を提供してswapます:

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**実際の配列の使用を検討してください。なぜなら、その型があなたが思っていることをしているのではないかという深刻な疑いがあるからです。

于 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 ループは の値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>をクリックしてアクセスします。

于 2012-11-04T18:58:49.023 に答える