1083 List Grades (25 分)

Given a list of N student records with name, ID and grade. You are supposed to sort the records with respect to the grade in non-increasing order, and output those student records of which the grades are in a given interval.

Input Specification:

Each input file contains one test case. Each case is given in the following format:

N
name[1] ID[1] grade[1]
name[2] ID[2] grade[2]
... ...
name[N] ID[N] grade[N]
grade1 grade2

where name[i] and ID[i] are strings of no more than 10 characters with no space, grade[i] is an integer in [0, 100], grade1 and grade2 are the boundaries of the grade's interval. It is guaranteed that all the grades are distinct.

Output Specification:

For each test case you should output the student records of which the grades are in the given interval [grade1grade2] and are in non-increasing order. Each student record occupies a line with the student's name and ID, separated by one space. If there is no student's grade in that interval, output NONE instead.

Sample Input 1:

4
Tom CS000001 59
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
60 100

Sample Output 1:

Mike CS991301
Mary EE990830
Joe Math990112

Sample Input 2:

2
Jean AA980920 60
Ann CS01 80
90 95

Sample Output 2:

NONE

题目大意:给出n个学生,姓名id分数,并给出分数区间,要求在分数区间内的学生按分数排序输出。

//这个就很简单啦,我的AC:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Stu{
string name,id;
int sco;
};
vector<Stu> allstu;
vector<Stu> stu;
bool cmp(Stu&a,Stu&b){
return a.sco>b.sco;
}
int main() {
int n;
cin>>n;
string name,id;
int sco,low,high;
for(int i=;i<n;i++){
cin>>name>>id>>sco;
allstu.push_back(Stu{name,id,sco});
}
cin>>low>>high;
for(auto it=allstu.begin();it!=allstu.end();){
if(it->sco<low||it->sco>high){
it=allstu.erase(it);//
}else it++;
}
if(allstu.size()==){
cout<<"NONE";
}else{
sort(allstu.begin(),allstu.end(),cmp);
for(int i=;i<allstu.size();i++){
cout<<allstu[i].name<<" "<<allstu[i].id<<'\n';
}
}
return ;
}

//以下是遇到的问题:

1,关于使用vector::erase函数。

参数是iterator迭代器,转自:https://www.cnblogs.com/zsq1993/p/5930229.html

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == )
veci.erase(iter);
}

乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == )
iter = veci.erase(iter);
}

这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if( *iter == )
iter = veci.erase(iter);
else
iter ++ ;
}

第三种是正确的写法,学习了!!

最新文章

  1. CentOS 下 rpm包与 yum 安装与卸载
  2. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)
  3. Python学习总结8:文件模式及操作方法汇总
  4. 记linux下使用create_ap 创建热点失败及解决(涉及rfkill)
  5. IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)
  6. ES6的promise的学习
  7. JavaEE Tutorials (10) - Java持久化查询语言
  8. sql 语句优化
  9. 历届试题 剪格子 IDA*
  10. R+tmcn笔记︱tmcn包的基本内容以及李舰老师R语言大会展示内容摘录
  11. Windows核心编程第一章.错误处理
  12. Mybatis学习(四)————— 高级映射,一对一,一对多,多对多映射
  13. JSP内置九个对象Request请求对象
  14. MySQL中的时态(日期/时间)数据类型
  15. loadrunner 关联匹配多个值
  16. jps -- process information unavailable
  17. DOM中的事件对象和IE事件对象
  18. [UE4]编程师外挂Visual Assist X
  19. 写markdown用于Github上readme.md文件
  20. BZOJ3244 NOI2013树的计数(概率期望)

热门文章

  1. 落实制度靠流程&lt;摘自平安50万人的执行力&gt;
  2. ModelState.AddModelError使用
  3. iOS-WKWebView使用
  4. 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第四节:3D公告板
  5. Android弹出Dialog使用举例
  6. 07python之字符串的常用方法
  7. 微信移动端(wap)开发调试工具
  8. 嵌入式Linux下Qt的中文显示
  9. 好用的在线Markdown编辑器
  10. poj_2406 kmp