我正在尝试通过属性对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
复制构造函数。 ]
这是向量的创建:
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尝试交换sort()
元素时,它会临时复制Student
元素。由于您未指定其他任何内容,因此将执行默认的逐成员副本。
在您的Student
类中,您具有Student
的列表。列表与包含的Curs
元素类似地被复制。但是对于Curs,您已经定义了自己的赋值运算符:
Curs
生成的Curs& Curs::operator=(Curs arg) noexcept
{
std::swap(*this, arg);
return *this;
}
后面的代码使您可以再次复制Curs,这将再次调用swap和Curs,....依此类推,直到堆栈溢出或内存耗尽。
顺便说一下,我看到您已经创建了该运算符来规避Curs类所包含的const成员背后的限制。以这种方式欺骗编译器以更改const元素是未定义的行为。因此,消除需要复制的成员的常数性。
只需除去该(错误实现的)运算符和constness,它将起作用。
您可以通过引用传递矢量,而无需通过swap()
引用将对象传递到循环中来更改对象,如下所示。
但是要确保成员函数const
是常量
afisare
但是我认为还有另一个例外原因。您应该检查过您的班级定义