2012-11-04 4 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

문제의 자세한 설명을 보면 "swap"이 원하는 것을 실제로 전달하지 못하는 것처럼 보입니다. 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>에 액세스 할 수 있습니다.

관련 문제