题目描述
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例:
输入:
3
0
fang 90
yang 50
ning 70
输出:
fang 90
ning 70
yang 50
解决思路
1、这是一道多条件排序问题。首先需要建立结构体来存放字符串与整型变量
2、利用stable_sort() 来根据进行升序,降序排列。
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <vector> 5 using namespace std; 6 7 typedef struct stu 8 { 9 string name; 10 int grade; 11 }student; 12 13 int cmp1(student a,student b) 14 { 15 return a.grade > b.grade; 16 } 17 18 int cmp2(student a,student b) 19 { 20 return a.grade < b.grade; 21 } 22 23 24 int main() 25 { 26 int count=0,cmp=0; 27 student s; 28 int grade; 29 string name; 30 int n = count; 31 while(cin >> count >> cmp) 32 { 33 vector<student> stuVect; 34 while(count--) 35 { 36 cin >> name >> grade; 37 s.name = name; 38 s.grade =grade; 39 stuVect.push_back(s); 40 } 41 if(cmp == 0) 42 stable_sort(stuVect.begin(),stuVect.end(),cmp1); 43 if(cmp == 1) 44 stable_sort(stuVect.begin(),stuVect.end(),cmp2); 45 46 for(auto it = stuVect.begin(); it != stuVect.end(); it++) 47 cout << it -> name << ' ' << it -> grade << endl; 48 } 49 return 0; 50 }
summary
遇到了很多的麻烦,通过这道题目我也认识到了很多新的知识点
1、sort() 函数 与 stable_sort() 函数
- 需要头文件<algorithm>
- 语法描述:sort(begin,end,cmp)stable_sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。
- stable_sort() 函数 可保证相等元素的原本相对次序在排序后保持不变
- 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b);
- 简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是非降序排列。
- 对于vector 变量来说,sort(v.begin(),v.end())
在这里要注意一下函数的 cmp 参数:
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。
比较函数是一个自己定义的函数,返回值是bool型或整型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
1 bool cmp(int a,int b) 2 { 3 return a>b; 4 }
2、vector 容器的应用
- push_back 在数组的最后添加一个数据
- pop_back 去掉数组的最后一个数据
- at 得到编号位置的数据
- begin 得到数组头的指针
- end 得到数组的最后一个单元+1的指针
3、访问vector
1 //使用迭代器将容器中数据输出 2 vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 3 for(it=obj.begin();it!=obj.end();it++) 4 { 5 cout<<*it<<" "; 6 }