STL 的应用,想知道如何改正代码

编程要求
学员需要设计一个学员信息表,并在主函数中读取输入,根据输入的内容作出相应的动作。
输入共有4种,格式如下:

A <姓名> <分数>,向信息表的末尾添加一条记录,内容为<姓名> <分数>,分数均为整数。
注意:如果表中已有同一个人的记录,那就只更新分数。

R <姓名>,删除表中指定姓名的条目,不存在则不做处理。
P,按照<姓名> <分数>的格式打印整个信息表,每条记录占1行。如果表为空,则输出一行[空]。
S,将整个信息表的数据按照分数的降序排序。
注意 :为了保证排序结果稳定,输入的数据保证不会有两条记录有相同的分数。

每种格式的输入占一行,测试有多行输入。详细见测试说明。

测试说明
测试输入:

A 小明 89
A 小张 91
A 小李 67
P
R 小李
S
P

预期输出:

小明 89
小张 91
小李 67
小张 91
小明 89

#include 
#include 
#include 
#include 
#include
using namespace std;
class student{
public:
    string name;
    int grade;
    student(){}
    student(string n,int g):name(n),grade(g){}
    student(string n):name(n){}
};
bool operator<(student &a,student &b)
{
    return a.gradebool operator==(student &a,student &b)
{
    return a.name==b.name;
}
ostream &operator<<(ostream &out,student &a){
    out<" "<return out;
}
void swap(student &a,student &b){
    student temp;
    temp=a;
    a=b;
    b=temp;
}
int main()
{
    char a;
    student m;
    vector  s;
    while((a=getchar())!=EOF){
        string n;
        int g,flag=0;
        switch(a){
            case 'A':
                cin>>n>>g;
                s.push_back(student(n,g));
                break;
            case 'R':
                cin>>n;
                m=student(n);
                for(vector::iterator it=s.begin();it!=s.end();it++)
                {
                    if(*it==m){
                        swap(s.back(),*it);
                        s.pop_back();
                    }
                }
                break;
            case 'P':
                for(vector::iterator it=s.begin();it!=s.end();it++){
                    cout<<*it;
                    flag=1;
                }
                if(flag==0)cout<break;
            case 'S':
                for(vector::iterator it=s.begin();it!=s.end();it++){
                    for(vector::iterator its=it+1;its!=s.end();its++){
                        if(*it<*its)swap(*it,*its);
                    }
                }
                break;
            default:break;
        }
    }
    return 0;
}





似乎是在删除或者降序排列的时候出的问题,但又一直不知道怎么改,求解QAQ

https://blog.csdn.net/jingguo_/article/details/102924538

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这份代码的逻辑基本正确,但是在进行降序排列和删除时,存在一些小问题。

1.删除
在删除的时候,如果存在多条记录拥有相同的姓名,那么删除只会删除第一条遇到的记录。可以在找到要删除的记录之后,将其与最后一条记录进行交换,并删除最后一条记录,这样就可以删除所有匹配的记录。

修改后的代码:

case 'R':
    cin >> n;
    m = student(n);
    for (vector<student>::iterator it = s.begin(); it != s.end(); it++) {
        if (*it == m) {
            swap(*it, s.back());
            s.pop_back();
            it--; // 因为交换了位置,需要将指针向前移一位
        }
    }
    break;



2.降序排列
在降序排列时,可以使用STL中的sort函数,同时指定排序规则为按照分数降序排列。

修改后的代码:

case 'S':
    sort(s.begin(), s.end(), greater<student>());
    break;


这里使用了STL中的greater函数,将其作为sort函数的第三个参数,表示按照降序排列。这样就可以实现稳定的降序排列了。