对象的排序向量接收堆栈溢出异常c ++

问题描述 投票:0回答:2

我正在尝试通过属性对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上找到

c++ sorting vector stl std
2个回答
1
投票

[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,它将起作用。


0
投票

您可以通过引用传递矢量,而无需通过swap()引用将对象传递到循环中来更改对象,如下所示。

但是要确保成员函数const是常量

afisare

但是我认为还有另一个例外原因。您应该检查过您的班级定义

© www.soinside.com 2019 - 2024. All rights reserved.