2016-10-04 13 views
1

Studentクラスへのポインタを含むベクトルを持ちます。私はベクトル要素を並べ替えるだけで、内容を変更するのではなく、ポインタを変更する必要があります。ここに私の呼び出し元のコードは次のとおりです。ここでベクトルが要素を変更しないのはなぜですか?

StudentsFileReader* sfr = new StudentsFileReader(filepath); 

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

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

cout << "Done!" << endl; 

は私の呼び出し元のコードは次のとおりです。

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関数内完全に実行し、それが戻ったとき、ベクトルはそのまま保持します。

呼び出し関数間で変更を保持するにはどうすればよいですか?

ありがとうございます!

+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'が参照ではなくポインタを返しています –

関連する問題