2009-04-16 5 views
7

나는 프로그램하는 법을 배우고 있으며, C++이 제 첫 번째 언어입니다. 나에게 보여주기 위해 포인터를 사용하여 귀찮게하지 마라. 나는 아직 그들을 이해하지 못하고, 이것에 바칠 시간이 없을 때까지 귀찮게하지 않을 것이다. 알고리즘은 설명이 아니라 구현, 병합 정렬 알고리즘을 -초기화 후 C++ 배열의 크기를 조정할 수 있습니까?

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

은 나는 (몇 친구들이 저를 돕는 학습 나는 수업을하고 있지 않다)가 할당되었다. 이것을 다시 작성하여 홀수 및 짝수 모두에서 작동합니다. 나는이 코드를 추가하려고 시도했다 :

if ((n % 2) != 0) int farray[halfelements + 1]; 

그래서 같은 정수를 사용하여 두 개의 후속 어레이에서 반복 할 수 있었다. sizeof (farray)는 16 바이트 또는 4 정수로 표시됩니다. 따라서 크기가 조정되지 않습니다. 내가 알고 싶은 것 - 배열을 초기화 한 후에 크기를 조정할 수 있습니까?

편집 : 벡터를 구현하려면 어떻게해야합니까? 루프를 반복하여 값을 복사하고 복사하는 반복기를 사용하는 방법을 이해할 수 없습니다.

답변

16

C++ 배열의 크기는 고정되어 있습니다.

"크기 조정 가능한 배열"이 필요한 경우 배열 대신 std::vector을 사용하는 것이 좋습니다.

+0

좋습니다, 감사합니다. 나는이 알고리즘에 std :: vector를 구현하는 방법을 알아 냈다.내가 두 시간 동안 내 코드를 디버깅하는 데 쓰지 않았 으면 좋겠지 만 "int mergeSort (std :: vector, int)"함수에 ""=/ – jkeys

+0

이 누락되었습니다. 동적 배열에 의해 어쨌든? 배열이나 벡터의 크기를 동적으로 조정하면 똑같은 성능 저하가 야기됩니다.> – Jason

1

배열의 크기를 조정하려면 자동으로 크기를 조정할 수있는 벡터를 사용하고 싶을 것입니다.

4

내 조언은 더욱 강력합니다. C 스타일 배열을 사용해야하는 매우 좋은 이유가 없다면 std::vector<> (et. al.)을 사용하십시오. C++을 배우므로 그 이유가 확실하지 않습니다. std::vector<>을 사용하십시오.

+0

벡터가 연속 된 저장소를 사용해야하는 경우 포인터를 사용하는 메서드로 전달할 때도 벡터를 사용할 수 있습니다. 데이터의 크기를 조정하는 메소드의 포인터에 대한 참조/포인터를 전달할 때만 원시 메모리를 사용해야합니다. – Richard

1

배열에서와 같은 방법으로 벡터에 [] 연산자를 사용할 수 있습니다. (당신이 더 많은 벡터 방법을 사용하기를 원한다면)이 같은 벡터 뭔가이 구현할 수 : 또한 벡터 액세스 확인 경계를 추가 (인덱스) .at 사용할 수 있습니다

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

.

if ((n % 2) != 0) int farray[halfelements + 1]; 

그것은 단지 당신의 경우와 동일합니다 : 당신이 만약 문에 괄호를 생략하면

를 : 첫 번째 아이디어는 컴파일하지만 작동하지 않은 이유를 알고 싶다면

+0

"pre"HTML 태그를 코드에 사용하지 마세요. 대신 마우스로 코드를 선택하고 Ctrl-K를 입력하거나 코드 아이콘을 클릭하십시오. –

+0

그는 벡터 (iter, iter) 생성자를 사용해야합니다. 벡터 farray (originalarray.begin(), & originalarray [절반]), sarray (& originalarray [절반], originalarray.end()); 이후에 복사본이 제거됩니다. 그러나 그것은 혼란 스럽습니다. – jmucchiello

0

올바른 크기의 farray '- 후 즉시 범위를 벗어나와 사라, 당신은 단지 원래 왼쪽있어 :'은

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

그래서 그것이을하고 그들을 사용하는 거라고.

2

std::vector도 권장합니다. 그러나 배열을 사용하는 경우 배열을 더 크게 만들 필요가있는 경우 항상 malloc 메모리를 사용하고 realloc을 사용할 수 있습니다.

여기에 검색을 수행하면 mallocrealloc에 대한 정보가 있습니다.

+0

나도이 규칙을 사용한다. – Hydro