2016-10-04 5 views
1

Имейте вектор, который содержит указатели на класс Студента. Мне нужно, чтобы выбор сортировал векторные элементы, только изменяя указатели, а не содержимое. Вот мой код звонящего по телефону:Почему вектор не меняет свои элементы?

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()); 

Другим решением было бы сделать метод внутри StudentsFileReader, который использует SelectionSort::sortPositionExchange для сортировки вектор. Это будет выглядеть примерно так:

void StudentsFileReader::sortPositionExchange() { 

    SelectionSort::sortPositionExchange(students); 
} 
+0

Примечание: Это разрушает инкапсуляцию 'StudentsFileReader' и прерывает управление жизненным циклом (указатель недействителен, как только« StudentsFileReader »уходит, но поскольку это указатель, а не ссылка, сторонники могут не понимать, что они не владеют тем, что это указывает на). Это может решить проблему, но это создает другие проблемы. – ShadowRanger

+0

Это правда, спасибо за ваш комментарий –

+0

'& studentsVector' возвращает указатель, а не ссылку –