在其他函数中对结构和向量部分的向量进行排序?

时间:2011-11-01 05:14:33

标签: c++ function sorting vector

我有vector structs。 我需要根据struct向量中每个students中学生的姓氏,按字母顺序对向量进行排序。这可能吗? struct中的每位学生都有以下信息:

struct Student
{
    string lastName;
    string firstName;
    string stdNumber;
    double assgn1;//doubles are what I want to add in another function.
    double assign2;
    double assign3;
    double assign4;
    double midTerm;
    double finalGrade;

bool operator<(Student const &other) const { 
    return lastName < other.lastName;
}
};

这是我的students向量制作和填充的地方:

int getFileInfo()
{
int failed=0;
ifstream fin;
string fileName;
vector<Student> students;// A place to store the list of students
Student s;                  // A place to store data of one student
cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl;
do{
    if(failed>=1)
    cout<<"Please enter a correct filename."<<endl;
    cin>>fileName;
    fin.open(fileName.c_str());// Open the file
    failed++;
}while(!fin.good());
     while (fin >> s.firstName >> s.lastName >> s.stdNumber){
     cout<<"Reading "<<s.firstName<<" "<<s.lastName<<" "<<s.stdNumber<<endl;
     students.push_back(s); 
}
     vector<Student>::iterator loop = students.begin();
     vector<Student>::iterator end  = students.end();
     fin.close();   

     return 0;
}

所以我想对姓氏上的struct进行排序,然后能够在另一个函数中操纵向量中的每个“Student”结构。这可能吗?

我希望能够将double部分添加到我在另一个函数中的向量中的每个学生。然后我希望能够打印出每个学生的所有信息。如果我在students向量所在的函数中执行此操作,我可以打印出每个学生的信息,但我需要在另一个函数void gradeInput()中打印。我会cin>>每个学生double年级,一次一个学生。我以为它看起来像这样:

void gradeInput()
{
For(each student)// I don’t know what to do to in this for loop to loop through 
//each student. I want to make it so everywhere “stud” is change to the 
//next student after one loop iteration.

 //I made a default `Student` called ‘stud’ to show this example..
    cout<<"Student "<<stud.firstName<<" "<<stud.lastName<<" "<<stud.stdNumber<<":";
    cout<<"Please, enter a grade (between 0.0 and 100.0) for ... "<<endl;
    cout<<"Assignment 1:";
    cin>>stud.assgn1;
    cout<<endl;
    cout<<"Assignment 2:";
    cin>>stud.assign2;
    cout<<endl;
    cout<<"Assignment 3:";
    cin>>stud.assign3;
    cout<<endl;
    cout<<"Assignment 4: ";
    cin>>stud.assign4;
    cout<<endl;
    cout<<"MidTerm: ";
    cin>>stud.midTerm;
    cout<<endl;
    cout<<"Final Exam: ";
    cin>>stud.finalGrade;
    cout<<endl;

return;
}

希望这有点道理,我可以得到一些帮助!我的老师没有帮助我,因为她没有回复电子邮件,并且有45分钟的办公时间,所以你友好的人都是一个很好的资产!谢谢!
附:很抱歉代码格式不佳,我仍然想弄清楚网站的代码输入。

1 个答案:

答案 0 :(得分:0)

让排序工作非常简单 - 只需为该类型定义operator<

class student {
    // ...

    bool operator<(student const &other) const { 
        return last_name < other.last_name;
    }
};

请注意,您可能希望(例如)将学生的名字用作辅助排序字段,仅在姓氏相同的情况下使用。

就读取学生的数据而言,您通常希望在名为operator>>的函数中执行此操作,例如:

std::istream &operator>>(std::istream &is, student &s) { 
    is >> student.last_name;
    is >> student.first_name;
    // read other fields;
    return is;
}

如果完全合理的话,我会尽量避免让条目具有交互性。虽然在学生作业中很常见,但它使程序几乎无法使用。打印信息通常使用operator<<完成,operator>>本质上是operator>>的镜像(即,它写入而不是读取,但应以相同的顺序写入字段,格式为{ {1}}可以阅读)。