动态学生信息管理

任务描述

本关任务:编写一个能动态管理学生信息的程序。

相关知识

本关涉及的内容如下:

  • vector容器的使用
  • 容器的迭代器
  • sort函数的使用
  • find函数的使用
vector容器的使用

vector位于头文件<vector>,是C++提供的一种顺序存储的容器,能通过位置索引高效的访问容器中的任意元素,可以看做是一个长度能动态变化数组

vector类是一个模板类,使用时需要指定模板参数。注意:作为模板参数的类型要有无参数的构造函数(如果不使用Allocator)。

它常用的构造函数如下:

 
  1. int main()
  2. {
  3. vector<string> v; //无参数版
  4. vector<string> v2(10); //初始容量为10的vector,每个元素为都为string的默认值
  5. vector<string> v3(10,"abc"); //初始容量为10,且每一个元素都为 abc
  6. }

如果要访问或者修改vector的内容可以用如下的函数:

 
  1. vector<int> v;
  2. v.push_back(10); //将一个元素添加到容器的末尾
  3. v.push_back(20);
  4. cout << v[0] << endl; //访问索引为0的元素,即 10
  5. v.erase(v.begin() + 1); //删除索引为1的元素,begin()函数的含义见下一节
  6. v.insert(v.begin() + 1,30); //在索引为1的元素之前插入一个元素
  7. v.clear(); //删除所有元素

同时,vector还有如下的成员函数用于查询元素数量:

 
  1. int size = v.size(); //返回元素数量
  2. bool isem = v.empty(); //容器为空则返回true

vector的成员函数不仅仅只有这些,感兴趣的同学可以查阅其他资料进行学习。

容器的迭代器

STL中的容器都提供了 迭代器iterator 成员类型,它就像一个指针,使用它能按照一种 特定的顺序 遍历容器中的所有元素。

一般来说,当你对一个迭代器it进行it++自增操作时,就能进入到下一个元素,进行it--自减操作时,就能回到上一个元素。有些迭代器还支持it+=2it-=2这样跨多个元素的操作。而对它使用*it取值操作,就能获得当前的元素值

上一节的begin()函数,返回的其实就是一个指向第一个元素的迭代器,与之对应的还有一个end()函数,它返回一个指向最后一个元素之后不存在的元素的迭代器,有了这两个函数,我们就能访问vector中的所有元素了:

 
  1. vector<int> v(5,10); //容量为5,元素值都是10
  2. for(vector<int>::iterator it = v.begin();it != v.end();it++)
  3. cout << *it << " ";

得到的结果是:

10 10 10 10 10

此时我们也可以知道,vectoreraseinsert函数的参数实际上都是迭代器类型。

注意:在使用迭代器迭代一个容器的过程中,使用修改容器内容的函数可能会使得迭代器无效,因此尽量不要在这个过程中修改容器内容。

sort函数的使用

sort函数位于头文件<algorithm>,它接受两个迭代器参数firstlast,代表要排序的范围,为左闭右开,即[first,last),然后将这个范围里的元素按照升序排列。

它要求迭代器的元素类型重载了此类型对象间比较用的<运算符

注意:指针也可以看做是一种迭代器,所以对于数组也是可以使用这个函数的。

比如:

 
  1. vector<int> v;
  2. v.push_back(2);
  3. v.push_back(1);
  4. int vs[]={2,1};
  5. sort(v.begin(),v.end()); //排序vector
  6. sort(vs,vs + 2); //排序数组

两个容器内的元素都是:1 2

find 函数的使用

find函数位于头文件<algorithm>,它接受三个参数,前两个迭代器类型的firstlast参数代表范围,左闭右开,第三个value参数代表要查找的内容,因此元素类型必须重载了用于元素和value之间比较的==运算符

它返回的也是一个迭代器,如果找到了这个元素,则返回指向这个元素的迭代器,如果没有,则返回last参数

比如:

 
  1. vector<int> v;
  2. v.push_back(2);
  3. v.push_back(1);
  4. int vs[]={2,1};
  5. find(v.begin(),v.end(),3); //不存在3元素,所以会返回v.end()
  6. find(vs,vs + 2,1); //返回指向数组中 1 元素的指针

注意find函数在比对元素的时候,==运算符的第二个参数是要找的内容,即参数value

编程要求

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

  • A <姓名> <分数>,向信息表的末尾添加一条记录,内容为<姓名> <分数>,分数均为整数

注意:如果表中已有同一个人的记录,那就只更新分数。

  • R <姓名>,删除表中指定姓名的条目,不存在则不做处理。
  • P,按照<姓名> <分数>的格式打印整个信息表,每条记录占1行。如果表为,则输出一行[空]
  • S,将整个信息表的数据按照分数的降序排序。

注意 :为了保证排序结果稳定,输入的数据保证不会有两条记录有相同的分数。

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

测试说明

测试输入:

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

预期输出:

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


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

class Stu
{   
    private:
        string Name;
        int Grade;
    public:
    	bool operator>(const Stu& a){return Grade>a.Grade;}
    	bool operator==(string s){return Name==s;}
        friend ostream& operator<<(ostream& s,const Stu& a){
        	cout<<a.Name<<' '<<a.Grade;
        	return s;
		}
        const string& GetName()const{return Name;}
        const int& GetGrade()const{return Grade;}
        void SetName(string name){Name=name;}
        void SetGrade(int grade){Grade=grade;}
        Stu(){}
        Stu(string n,int g):Name(n),Grade(g){}
        Stu(const Stu& s):Name(s.Name),Grade(s.Grade){}
};
bool complare(Stu& a,Stu& b){return a>b;}
int main()
{
    vector<Stu> stu;
    string name;
    int grade;
    char to;
    Stu s;
    vector<Stu>::iterator it;
    while((to=getchar())!=EOF){
        switch(to){
            case 'A':
                cin>>name>>grade;
                it=find(stu.begin(),stu.end(),name);
                s.SetName(name);
                s.SetGrade(grade);
                if(stu.end()==find(stu.begin(),stu.end(),name))
					stu.push_back(s);
				else
					*it=s;
				break;
			case 'R':
				cin>>name;
                it=find(stu.begin(),stu.end(),name);
				if(stu.end()!=it)
					stu.erase(it);
				break;
			case 'P':
                if(stu.empty())
                    cout<<"[绌篯"<<endl;
                else
				    for(it=stu.begin();it<stu.end();it++)
					    cout<<*it<<endl;
				break;
			case 'S':
				sort(stu.begin(),stu.end(),complare);
				break;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值