C++排序Student对象vector时触发栈溢出异常问题求助
解决vector排序时的栈溢出与const访问错误问题
先梳理你遇到的两个核心问题,咱们逐个拆解解决:
1. 栈溢出的根源与修复
你当前的sortStudenti函数参数用的是值传递:
void sortStudenti(std::vector<Student> studenti) { ... }
这意味着调用函数时,整个vector<Student>会被完整拷贝到栈内存中。如果每个Student里的cursuri(std::list<Curs>)包含大量元素,有限的栈空间很快就会被占满,直接触发栈溢出——这和你看到的堆栈跟踪指向Curs拷贝构造函数完全吻合,因为拷贝vector时会逐个拷贝Student对象,每个Student又会拷贝自己的list<Curs>。
修复方案:改成引用传递
根据需求选择两种引用方式:
- 如果要直接修改原vector,用非const引用:
void sortStudenti(std::vector<Student>& studenti) { std::sort(studenti.begin(), studenti.end(), Student::sortByMedie); for (auto& student : studenti) { // 这里也建议用引用,避免再次拷贝Student student.afisare(); } }
- 如果只是排序后输出、不想修改原vector,用const引用+堆上拷贝局部vector:
void sortStudenti(const std::vector<Student>& studenti) { auto sortedStudenti = studenti; // 拷贝到堆分配的局部vector,而非栈 std::sort(sortedStudenti.begin(), sortedStudenti.end(), Student::sortByMedie); for (auto& student : sortedStudenti) { student.afisare(); } }
另外建议检查Curs的拷贝构造函数,确认是否存在递归调用或不必要的大内存分配——如果拷贝逻辑本身有问题,也会加剧栈溢出风险。
2. 原仿函数方案的const访问错误修复
你最开始尝试的仿函数写法触发const访问错误,是因为getMedie()不是const成员函数,而仿函数的参数是const Student&,const对象只能调用const修饰的成员函数。
修复步骤:
- 先把
Student类的getMedie()声明为const成员函数:
class Student { // ... 其他私有成员 public: // 加上const修饰符,确保不会修改成员变量 double getMedie() const { // 你的成绩计算逻辑 return medie; } // ... 其他成员函数 };
- 之后就可以正常使用仿函数了:
void sortStudenti(std::vector<Student>& studenti) { struct StudentCompare { bool operator()(const Student& a, const Student& b) const { return a.getMedie() > b.getMedie(); // 现在能正常调用const成员函数 } }; std::sort(studenti.begin(), studenti.end(), StudentCompare()); for (auto& student : studenti) { student.afisare(); } }
额外简化建议:使用Lambda表达式
C++11及以后,用Lambda表达式替代自定义仿函数会更简洁,同样需要getMedie()是const成员函数:
void sortStudenti(std::vector<Student>& studenti) { std::sort(studenti.begin(), studenti.end(), [](const Student& a, const Student& b) { return a.getMedie() > b.getMedie(); }); for (auto& student : studenti) { student.afisare(); } }
内容的提问来源于stack exchange,提问作者Gradin98
相关产品推荐
相关产品推荐

