Я пытаюсь отсортировать вектор Student
объектов по атрибуту:
class Student
{
private:
std::string nume;
int an;
std::list<Curs> cursuri;
...
public:
Student();
Student(std::string nume, int an);
virtual ~Student();
...
};
с этим компилятором метода сортировки:
bool Student::sortByMedie(const Student& a, const Student& b)
{
return a.medie < b.medie;
}
void sortStudenti(std::vector<Student> studenti) {
std::sort(studenti.begin(), studenti.end(), Student::sortByMedie);
for (auto student : studenti) {
student.afisare();
}
}
Но я Возникла проблема с исключением переполнения стека при вызове метода сортировки:
Поток 0x4f6 c завершился с кодом 0 (0x0). Возникло исключение 0x776CBA3E (ntdll.dll) в LAB3.exe: 0xC00000FD: переполнение стека (параметры: 0x00000001, 0x01002FF0). Необработанное исключение в 0x776CBA3E (ntdll.dll) в LAB3.exe: 0xC00000FD: переполнение стека (параметры: 0x00000001, 0x01002FF0).
Я предполагаю, что проблема заключается в перераспределении размера вектора в Память. Если я просматриваю трассировку стека за пределами функций выделения памяти, последняя функция моего собственного кода (т. Е. Не стандартной библиотеки) является конструктором копирования Curs
, вызываемым перестановкой между двумя элементами Cusr
, который вызывается Curs::operator=
Это создание вектора:
std::vector<Student> studenti;
auto student1 = Student("gigel marian", 3);
student1.addCursuri(generateCoursList());
auto student2 = Student("gigel marian2", 3);
student2.addCursuri(generateCoursList());
auto student3 = Student("gigel marian3", 3);
student3.addCursuri(generateCoursList());
auto student4 = Student("gigel marian4", 3);
student4.addCursuri(generateCoursList());
auto student5 = Student("gigel marian5", 3);
student5.addCursuri(generateCoursList());
studenti.push_back(student1);
studenti.push_back(student2);
studenti.push_back(student3);
studenti.push_back(student4);
studenti.push_back(student5);
Сначала я попробовал этот метод:
void sortStudenti(std::vector<Student> studenti) {
struct studentCompare
{
bool operator()(Student const& a, Student const& b)
{
return a.getMedie() > b.getMedie();
}
};
std::sort(studenti.begin(), studenti.end(), studentCompare());
for (auto student : studenti) {
student.afisare();
}
}
, но я получил const
ошибки доступа , поэтому я попробовал по-другому.
Редактировать: дополнительный код
Полный код доступен на github