【发布时间】:2020-05-05 15:52:04
【问题描述】:
我正在尝试按属性对 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();
}
}
但是我在调用 sort 方法时遇到了堆栈溢出异常的问题:
线程 0x4f6c 以代码 0 (0x0) 退出。在 LAB3.exe 中的 0x776CBA3E (ntdll.dll) 处引发异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x01002FF0)。 LAB3.exe 中 0x776CBA3E (ntdll.dll) 处未处理的异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x01002FF0)。
我假设问题出在内存中向量大小的重新分配中。如果我浏览内存分配函数之外的堆栈跟踪,我自己的代码(即不是标准库)的最后一个函数是 Curs 复制构造函数,由两个 Cusr 元素之间的交换调用,由 @987654330 调用@
这是向量的创建:
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获取
【问题讨论】:
-
@Grandin98 您还通过值而不是引用循环遍历 studenti 向量,这意味着您正在对复制的对象调用 afisare 函数。见stackoverflow.com/questions/15927033/…
-
为什么你通过值而不是通过引用传递向量? stackoverflow.com/questions/26647152/…
-
关于堆栈溢出异常可能与您的 Student 类以及它如何处理复制有关。
-
@EyalD 我没有将向量作为参考传递,因为我不想修改原始列表
-
无法重现 stackoverflow 异常。发布类定义本身
标签: c++ sorting vector stl std