我定义了类
class student
{
int score1;
int score2;
...
public:
int sum;
...
}有定义了
class studentbox
{
vect<student> stu;public:
...
}
然后我向向量容器里加入student对象 怎样通过sum 对容器的对象排序
比如说用sort函数
class student
{
int score1;
int score2;
...
public:
int sum;
...
}有定义了
class studentbox
{
vect<student> stu;public:
...
}
然后我向向量容器里加入student对象 怎样通过sum 对容器的对象排序
比如说用sort函数
要不就使用map容器,它可以根据关键字排序
//#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<iomanip>
#include <functional>
using namespace std;class Student
{
int num;
string name;
string sex;
int score1;
int score2;
int score3;
int aver;
public:
int sum;
Student(int Nnum,string Nname,string Nsex,int score1,int score2,int score3);
void setNum(int Nnum){num=Nnum;}
int getNum(){return num;}
void setName(string Nname){name=Nname;}
string getName(){return name;}
void setSex(string Nsex){sex=Nsex;}
string getSex(){return sex;} void setScore1(int Nscore1){score1=Nscore1;}
int getScore1(){return score1;}
void setScore2(int Nscore2){score2=Nscore2;}
int getScore2(){return score2;}
void setScore3(int Nscore3){score3=Nscore3;}
int getScore3(){return score3;} int getAver(){return (score1+score2+score3)/3;}
int getSum(){return score1+score2+score3;}
void disp();
};class studentBox
{
vector<Student> stu;
public:
void addStudent();
void displayAll();
void menu();
};
bool less_sum(const Student &m1,const Student &m2)
{
return m1.sum>m1.sum;
}
void Student::disp()
{
cout<<setw(6)<<getNum() <<setw(8)<<getName() <<setw(6)<<getSex()
<<setw(6)<<getScore1() <<setw(6)<<getScore2()
<<setw(6)<<getScore3() <<setw(6)<<getSum()<<setw(6)<<getAver()<<endl;
}Student::Student(int Nnum,string Nname,string Nsex,int Nscore1,int Nscore2,int Nscore3)
{
setNum(Nnum);
setName(Nname);
setSex(Nsex);
setScore1(Nscore1);
setScore2(Nscore2);
setScore3(Nscore3);
}
void studentBox::addStudent()
{
vector<Student>::iterator iter; char ch;
int Nnum,Nscore1,Nscore2,Nscore3;
string Nname,Nsex;
int flag(1);
do{
if(stu.size()==0)
{
cout<<"请输入新学号: ";
cin>>Nnum;
}
else
{
do{
flag=1;
cout<<"请输入学号: ";
cin>>Nnum;
for(iter=stu.begin();iter!=stu.end();iter++)
if(iter->getNum()==Nnum)
{
cout<<"该学号已存在..."<<endl;
flag=0;
}
}while(flag==0);
}
cout<<"请输入姓名: ";
cin>>Nname;
cout<<"请输入性别: ";
cin>>Nsex;
cout<<"请输入数学成绩: ";
cin>>Nscore1;
cout<<"请输入语文成绩: ";
cin>>Nscore2;
cout<<"请输入英语成绩: ";
cin>>Nscore3;
Student s(Nnum,Nname,Nsex,Nscore1,Nscore2,Nscore3);
stu.push_back(s);
cout<<"\n 继续输入吗?(Y/N): ";
cin>>ch;
}while(ch=='Y'||ch=='y');
}void studentBox::displayAll()
{
vector<Student>::iterator iter;
if(stu.size()==0)
cout<<"没有学生资料......"<<endl;
else
{
sort(stu.begin(),stu.end(),less_sum); cout<<"学号 "<<"姓名 "<<"性别 "<<"数学成绩 "<<"语文成绩 "<<"英语成绩 "<<"总分 "<<"平均分 "<<endl;
for(iter=stu.begin();iter!=stu.end();iter++)
iter->disp();
}
}void studentBox::menu()
{
char ch;
do{
cout<<"选择1:学生数据的输入!"<<endl;
cout<<"选择2:排序并显示!"<<endl;
cout<<"选择0:退出!"<<endl;
cout<<"请选择你要进行的操作!"<<endl;
cin>>ch;
switch(ch)
{
case'1':addStudent();break;
case'2':displayAll();break;
case'0':cout<<"\t\t\tGoodbye!"<<endl;break;
default:cout<<"输入错误,重新输入:";break;
}
}while(ch!='0');}
int main()
{
studentBox box;
box.menu();
return 0;
}
排不了序
应该怎样修改?
int getSum()const{return score1+score2+score3;}
------------
这里明显的错误
bool less_sum(const Student &m1,const Student &m2)
{
return m1.getSum() > m2.getSum();
}
http://www.cnblogs.com/kevintian/articles/1277700.html下面这篇是关于直接用sort的。http://www.cnblogs.com/kevintian/articles/1277700.html看你想用哪个吧
你在执行排序sort(stu.begin(),stu.end(),less_sum)的时候,使用的是以sum这个成员的大小来排序的。可是排序的时候sum这个成员的值还没有生成,所以无法排序成功,需要在插入用户信息的时候,就生成sum值。
例如:
Student::Student(int Nnum,string Nname,string Nsex,int Nscore1,int Nscore2,int Nscore3)
{
setNum(Nnum);
setName(Nname);
setSex(Nsex);
setScore1(Nscore1);
setScore2(Nscore2);
setScore3(Nscore3);
sum = getSum();
} 重载<小于号操作符:
例如:
class Student
{
public:
int sum;
bool operator <(Student temp)
{
return this->sum < temp.sum;
}……
}
排序的时候使用sort:例如:
std::sort(stu.begin(), stu.end()); 就可以排序成功了,如下:学号 姓名 性别 数学成绩 语文成绩 英语成绩 总分 平均分
1 1 1 1 1 1 3 1
2 2 2 33 33 33 99 33输入学生3后:学号 姓名 性别 数学成绩 语文成绩 英语成绩 总分 平均分
1 1 1 1 1 1 3 1
3 3 3 22 22 22 66 22
2 2 2 33 33 33 99 33