问题求助:C++中vector向量元素的排序,调试出错

u010607079 2016-01-17 07:42:12
是这样的,自学C++看到有个信息管理系统的题目,就想学着做做。目前都很顺利。唯一一项还没实现的功能就是排序了。

程序的基本架构是:Student类的成员有“成绩”和“排名”等。我定义了一个vector容器存这些对象。通过比较这些对象的“成绩”将这些对象重新排名,然后写入每个对象的排名。

这个程序支持添加新的对象。新的对象用push_back()函数实现。push_back并完成对象的初始化后,程序就会调用排名函数。问题是,现在这个排名函数总是出错。里面的代码用到数组里没问题,但是用到vector里就提示出错。麻烦大家帮我看看这是怎么回事啊。提示的错误是vector subscript out of range。

程序如下:
void RankByGrade()
{
using namespace studentInformation;
using namespace std;
int flagCompareOut=0; //循环变量
int flagCompareIn=0; //循环变量
int rankVectorSize;
rankVectorSize = studentVector.size(); //容器的名字叫studentVector
if (rankVectorSize == 0)
{
cout << "---------------------------------" << endl
<< "系统当前没有学生信息!" << endl
<< "---------------------------------" << endl;
}
else if (rankVectorSize == 1)
{
studentVector[flagCompareOut].Student_WriteGradeRank(flagCompareOut + 1);
}
else //用了冒泡排序
{
int flagCompareOut = 0;
int flagCompareIn = 0;
for (flagCompareOut = 0; flagCompareOut < rankVectorSize - 1; flagCompareOut++)
{
for (flagCompareIn = 0; flagCompareIn < rankVectorSize - flagCompareOut - 1; flagCompareIn++)
{

if (studentVector[flagCompareIn].Student_ReadGrade() < studentVector[flagCompareIn + 1].Student_ReadGrade()) //如果前一个元素的成绩比后一个的成绩低,就交换位置。
{
Student studentTemp;
studentTemp = studentVector[flagCompareIn];
studentVector[flagCompareIn] = studentVector[flagCompareIn + 1];
studentVector[flagCompareIn + 1] = studentTemp;
}
} //排序完成
}
int i = 0;
for (i = 0; i < rankVectorSize; i++) //输出成绩。若后一个的成绩和前一个的一样,则两人的排名一样
{
if ((i>0)&(studentVector[i].Student_ReadGrade() == studentVector[i - 1].Student_ReadGrade()))
studentVector[i].Student_WriteGradeRank(studentVector[i - 1].Student_ReadGradeRank());
else
studentVector[i].Student_WriteGradeRank(i + 1);
}
}
}

...全文
186 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010607079 2016-01-17
  • 打赏
  • 举报
回复
引用 2 楼 qq_26968975 的回复:
vector是一个对象,调用时会产生临时vector ,函数参数改为 vector&
我没太看懂您的意思,我并没有调用studentVector。我把它定义在了namespace studentInformation里,每次修改都是直接对它修改的
u010607079 2016-01-17
  • 打赏
  • 举报
回复
引用 3 楼 begodliker 的回复:
1、错误提示vector越界了。冒泡排序的第二个for循环flagCompareIn 的范围是 0 到rankVectorSize -1,在进行交换时,调用了studentVector[flagCompareIn + 1],也就是可能调用tudentVector[rankVectorSize],越界。 2、vector的排序可以用标准库的算法,sort。提供一个operator< 操作就行了
首先十分感谢您的回答,不过我觉得您说的第一个问题是不存在的,我的原因有两点: 1,我把这个冒泡排序的算法移植到了一个数组上,然后工作完全正常,只有在vector向量上工作不正常,所以我认为这个排序算法是没问题的。 2、您说的第二个for循环,我的范围是flagCompareIn<rankVectorSize-flagCompareOut-1。当flagCompareOut为0时,flagCompareIn最大,此时的表达式为:flagCompareIn<rankVectorSize-1,也就是说,flagCompareIn的最大值为rankVectorSize-2。这种情况下,比较函数中的flagCompareIn+1=rankVectorSize-1,所以并不会越界。 不过我打算试试您说的sort函数,谢谢您的解答!
begodliker 2016-01-17
  • 打赏
  • 举报
回复
1、错误提示vector越界了。冒泡排序的第二个for循环flagCompareIn 的范围是 0 到rankVectorSize -1,在进行交换时,调用了studentVector[flagCompareIn + 1],也就是可能调用tudentVector[rankVectorSize],越界。 2、vector的排序可以用标准库的算法,sort。提供一个operator< 操作就行了
gaodlike 2016-01-17
  • 打赏
  • 举报
回复
vector是一个对象,调用时会产生临时vector ,函数参数改为 vector&
yshuise 2016-01-17
  • 打赏
  • 举报
回复
为什么不用sort?

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧