2016-10-04 2 views
1

Student 클래스에 대한 포인터를 포함하는 벡터를가집니다. 나는 벡터 요소를 정렬하기 위해서만 내용을 바꾸지 말고 포인터를 바꿔야한다.벡터가 요소를 변경하지 않는 이유는 무엇입니까?

void SelectionSort::sortPositionExchange(vector<Student*>* students) 
{ 
    int i, j, min, aux, tam = students->size(); 

    for (i = 0; i < tam - 1; i++) 
    { 
     min = i; 
     for (j = (i + 1); j < tam; j++) 
     { 
      if (students->at(j)->getCode() < students->at(min)->getCode()) 
      { 
       min = j; 
      } 
     } 

     if (i != min) 
     { 
      Student* s = students->at(i); 
      *(&students->at(i)) = *(&students->at(min)); 
      *(&students->at(min)) = s; 
     } 
    } 
} 

선택 정렬이 완벽하게 sortPositionExchange의 함수 내에서 실행하지만 반환 할 때, 벡터가 변하지 유지 :

StudentsFileReader* sfr = new StudentsFileReader(filepath); 

cout << "Calling sortPositionExchange..." << endl; 

SelectionSort::sortPositionExchange(&(sfr->getStudents())); 

cout << "Done!" << endl; 

가 여기 내 호출 코드입니다 : 여기 내 발신자 코드입니다.

호출 기능 간 변경 사항을 유지하려면 어떻게해야합니까?

감사합니다.

+2

문제는'getStudents()'에 있고 여기의 코드에는 없습니다. – drescherjm

+3

또한 C++에서 벡터에 대한 포인터를 사용하여 참조로 벡터를 전달하는 것을 선호합니다. – drescherjm

+0

감사합니다. @drescherjm! getStudents()를 보겠습니다. –

답변

0

귀하의 방법 getStudents()은 벡터를 반환하고 반환 된 벡터는 원래 벡터가 아니며 사본입니다.
문제를 해결하려면 getStudents() 메서드를 원래 벡터에 대한 참조로 되돌립니다. 이 같은
그래서 당신의 방법을 찾아야한다 뭔가 :

vector<Student*>* getStudents() { 

    return &studentsVector; 
} 

과 같이 표시한다 전화 :

SelectionSort::sortPositionExchange(sfr->getStudents()); 

또 다른 해결책은 정렬 SelectionSort::sortPositionExchange를 사용 StudentsFileReader 내부의 방법을하는 것 벡터. 이것은 다음과 같이 보일 것입니다 :

+0

참고 : 이것은 StudentsFileReader의 캡슐화를 중단하고 평생 관리를 중단합니다 ('StudentsFileReader'가 사라지 자마자 포인터가 무효가됩니다. 포인터가 아니기 때문에 포인터가 참조가 아니므로 관리자가 자신이 소유하지 않은 것을 알지 못할 수도 있습니다) 그것은 가리킨다). 문제를 해결할 수도 있지만 다른 문제가 발생합니다. – ShadowRanger

+0

이것은 사실입니다. 귀하의 의견에 감사드립니다. –

+0

'& studentsVector'는 포인터가 아니라 참조 번호 –

관련 문제