2012-11-04 104 views
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); 
} 
+1

請允許我問:你是否希望只通過變量名來「交換」矩陣?如果是這樣,爲什麼不使用三向交換? int ** Tmp = A; A = B; B = Tmp;?這樣,B現在將引用先前由A引用的矩陣,而沒有任何頭痛。 – ATaylor

回答

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

它看起來像這是一個過濾或管道類型的操作,所以我建議只是交換指針而不是移動每個元素。

您將需要一箇中間指針來進行交換,但由於它只是一個指針,因此與矩陣的大小相比,這是一個固定的存儲量,所以如果數據集足夠大,它應該比複製快得多。

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

作爲一個結構或其它容器上述特別是如果你的存儲器的任何動態分配,需要釋放它以避免內存泄漏可能是有用的。

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>可以訪問它。