2012-06-10 6 views
0

이전에 보지 못했던 오류가 발생했습니다. 사물에 대한 참조가 모호합니다.C++ 삽입 정렬 중앙값 계산 오류

저는 실행중인 중간 값을 계산하는 작은 테스트 프로그램을 작성하고 있습니다. 목록이 커지면 중간 값이 다시 계산됩니다. 이 경우 중간 값은 목록의 가운데 번호 (또는 상단 중간)를 의미합니다. 따라서 7의 중앙값은 7이고 7과 9의 중앙값은 9이며 7 3과 9의 중앙값은 7입니다.

두 개의 동적 배열을 사용하여이 작업을 수행하고 있습니다. 처음에는 첫 번째 값이 중간 값으로 설정되고 입력 된 각 숫자는 현재 중간 값과 비교됩니다. 중간 값은 두 배열 사이의 중간 요소를 계산할 때 얻습니다.

왼쪽 배열은 중앙값보다 작은 값이고 오른쪽 배열은 모두 큰 배열입니다. 각 배열의 숫자를 정렬하기 위해 삽입 정렬을 사용합니다 (거의 정렬 된 목록에서 좋습니다).

내가 얻는 오류를 이해하지 못하거나 내가 잘못한 부분을 이해하지 못했습니다. 나는 C++을 처음 접했을 뿐이므로이 문제에 대한보다 간단한 접근법을 선택했다.

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

vector<int> left; 
vector<int> right; 
int leftCount = 0; 
int rightCount = 0; 
void leftInsertionSort(int); 
void rightInsertionSort(int); 
void inputNumber(int, int); 

int main(int argc, char** argv) { 

    int length = 0; 
    int value; 
    int median; 
    string input; 

    while (cin >> input) { 
     value = atoi(input.c_str()); 

     inputNumber(value, median); 

     if (leftCount > rightCount) { 
      median = (((leftCount + rightCount)/2) + 1); 
      cout << left[median]; 
     } else { 
      median = (((leftCount + rightCount)/2) + 1) - leftCount; 
      cout << right[median]; 
     } 
    } 

    return 0; 
} 

void inputNumber(int value, int median) { 
    if (leftCount == 0 && rightCount == 0) { 
     left[0] = value; 
     median = value; 
     leftCount++; 
    } else 
    if (leftCount == 1 && rightCount == 0) { 
     right[0] = value; 
     if (left[0] > right[0]) { 
      right[0] = left[0]; 
      left[0] = value; 
     } 
     median = right[0]; 
     rightCount++; 
    } else 
    if (value < median) { 
     left[leftCount] = value; 
    } else { 
     right[rightCount] = value; 
    } 
} 

void leftInsertionSort(int lLength) 
{ 
    leftCount++; 
    int key, i; 
    for(int j = 1; j < lLength; j++) 
    { 
     key = left[j]; 
     i = j - 1; 
     while (left[i] > key && i >= 0) { 
      left[i+1] = left[i]; 
      i--; 
     } 
     left[i+1] = key; 
    } 
} 

void rightInsertionSort(int rLength) 
{ 
    rightCount++; 
    int key, i; 
    for(int j = 1; j < rLength; j++) 
    { 
     key = right[j]; 
     i = j - 1; 
     while (right[i] > key && i >= 0) { 
      right[i+1] = right[i]; 
      i--; 
     } 
     right[i+1] = key; 
    } 
} 

내가 받고있는 것으로 보인다 오류는 '오류 : 참조'는 남아가 컴파일 할 때 내가 얻을 컴파일러 오류를 판단

+0

그리고 무엇이 오류입니까? –

+0

오류 : 'left'에 대한 참조가 모호합니다. – Edge

+0

나는 똑같이됩니다. – Edge

답변

2

'모호'보인다 네임 스페이스 std 정의합니다 이름도 leftright이며 변수 이름으로도 사용됩니다. 컴파일러는 사용할 정의를 결정할 수 없으므로 오류가 발생합니다. 이러한 이유로 네임 스페이스의 모든 것을 가져 오는 것이 싫어합니다. 명시 적으로 필요한 이름을 가져 오거나 네임 스페이스 한정자를 사용하는 것이 좋습니다.

어쨌든 알고리즘은 불필요하게 복잡해 보입니다. 새 번호를 얻을 때 하나의 벡터 push_back을 유지하는 것만 큼, 삽입 알고리즘을 사용하여 올바른 색인에 번호를 배치 한 다음 벡터의 중간 중간 요소를 반환하십시오.

1

leftrightiostream에 플래그입니다.

변수의 이름을 바꿉니다.

1

이것은 #using namespace std이 좋은 아이디어가 아닌 이유의 좋은 예입니다. leftrightstd 네임 스페이스에 대해 정의되어 있으며 이제 충돌이 발생합니다. 해당 행을 생략하고 std::으로 명시 적으로 네임 스페이스를 지정하여 vector, string, cin 및 cout을 참조하면이 충돌이 발생하지 않습니다.