2011-09-02 2 views
1

배열의 섹션 (청크)을 서로 바꿀 수있는 쉬운 방법이 있습니까?배열의 섹션을 C++로 서로 스와핑

array[0] = 1; 
array[1] = 2; 
array[2] = 3; 
array[3] = 4; 
array[4] = 5; 
array[5] = 6; 
array[6] = 7; 
array[7] = 8; 

과 거의 이러한 값을 주어 내 예에서, 그래서 StartY에서 endY에 대한 값의 범위 endX - startX에 의해 결정 값의 범위를 스왑 아웃 swapSections(startX, endX, startY, endY)라는 기능 : 그건 내가 배열을 가지고있다. ..

x range = 2startX = 0y range = 3startY = 5 경우가 놓여지는 어레이 [0]과 배열 [1] 배열 [5]과 배열 [6]이고, 다음 [배열 후 [7] 배열 배치 곳에 6], 다른 모든 것을 하나씩 밀어 낸다. 이 문제를 어떻게 해결해야할지 모르겠다. 임시 배열에 메모리를 물리적으로 복사하고 있었지만 더 나은 방법이 있다고 생각한다. (BTW, 내 예제의 최종 결과는 것) :

array[0] = 6; 
array[1] = 7; 
array[2] = 8;  
array[3] = 3; 
array[4] = 4; 
array[5] = 5; 
array[6] = 1; 
array[7] = 2; 
+0

왜 자신의 숙제를하지 않고 무언가를 배울 수 있습니까? 그것이 요점이다. –

+0

@Ed 나는 숙제를하려고했지만 아무런 성공도하지 못했습니다. – nyaan

+0

@nyaan 지금까지 시도한 것을 게시하십시오. – balki

답변

1

당신은 valarray보고 할 수 있습니다 그것은 조각입니다.

+0

나는'int * array = new int [];를 사용해야한다. ' – nyaan

+0

@downvoter - 이유가 무엇입니까? –

0

예제에서 취할 수있는 한 가지 방법은 최소 범위를 바꾼 다음 마지막 부분을 "버블 링"하는 것입니다. 그래서 :

이어서
array[0] = 1; --> 6 
array[1] = 2; --> 7 
array[2] = 3; 
array[3] = 4; 
array[4] = 5; 
array[5] = 6; --> 1 
array[6] = 7; --> 2 
array[7] = 8; 

하면 어레이를 교환하여 버블 8 [7], 어레이 [6] 다음 배열 [6] 배열 [5] 등에는 정확한 위치에 8 넣어까지 . 다행히 그게 당신을 시작하게합니다. https://ideone.com/ZVv2M

...하지만 그것은 단지 교환 할 부분 범위 :

1

가독성과 노력의 측면에서 배열의 섹션을 교환하는 가장 쉬운 방법은 표준 C++ 기능을 swap_ranges()

#include <iostream> 
#include <algorithm> 
int main() 
{ 
    int a[8] = {1,2,3,4,5,6,7,8}; 

    std::cout << "Beforeswap: "; 
    for(int i=0; i<8; ++i) 
      std::cout << a[i] << ' '; 
    std::cout << '\n'; 

    std::swap_ranges(a+0, a+2, a+5); 

    std::cout << "After swap: "; 
    for(int i=0; i<8; ++i) 
      std::cout << a[i] << ' '; 
    std::cout << '\n'; 
} 

테스트를 사용하는 것입니다 테스트 케이스에서와 같이 길이가 같지 않은 길이가 아닙니다. 귀하의 사례는 실제로 swap_ranges()rotate()의 조합입니다.

0

reverse(array, start, end)과 같은 특정 범위의 요소를 되돌릴 수있는 기능이 있다고 가정합니다 (또는 만들 수 있음). 그런 다음 네 단계에서이 작업을 수행 할 수 있습니다

// (1) reverse the first range 
array[0] = 2; 
array[1] = 1; 

// (2) reverse the elements between the ranges 
array[2] = 5; 
array[3] = 4; 
array[4] = 3; 

// (3) reverse the second range 
array[5] = 8; 
array[6] = 7; 
array[7] = 6; 

// (4) finally, reverse the entire array 
array[0] = 6; 
array[1] = 7; 
array[2] = 8; 
array[3] = 3; 
array[4] = 4; 
array[5] = 5; 
array[6] = 1; 
array[7] = 2; 

스포일러를 (먼저 숙제를 다음이 읽기)

당신은 표준 라이브러리를 사용할 수있는 경우 이 간단한 것을 만드는 에는 std::reverse 함수가 있습니다.

관련 문제