成绩排序(sort对容器进行排序)
做了一道题,题目是:
输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。
当看到本题目时,首先想到了关联容器map,但是我们知道关联容器map是根据key键值按字典顺序进行排序的,如果禁止map对key键值进行的自动排序,又失去了map的意义,相比也较难,所以不符合我们题目的要求。由于map中的元素数据类型为模板类型pair,因此我们可以使用vector嵌套pair作为数据类型,用make_pair输入进vector。
解决了数据类型和存储数据的问题我们现在需要思考的是如何将vector中的数据按我们的需求进行排序,虽然我们可以用学过的数据结构知识自行建立排序函数,但是在C++中已经为我们准备好了一个对标准容器进行排序的函数sort!
sort函数包含在头文件为
sort(vec.begin(),vec.end());
显然这种模式并不能满足我们的需求,让我们来看看sort的第二种形式sort(start,end,cmp)包含三个形参,对容器区间排序,它的第三个参数是一个“谓词”,谓词是一个可调用的表达式,可以用谓词来代替<。需要注意的是sort是一个不稳定排序,如果需要稳定排序应使用stable_sort。
#include<iostream>
#include<algorithm>
#include <vector>
using namespace std;
typedef pair<string, int> PAIR;
bool value_big(const PAIR& lhs, const PAIR& rhs) {
return lhs.second < rhs.second;
}
bool value_small(const PAIR& lhs, const PAIR& rhs) {
return lhs.second > rhs.second;
}
int main() {
int n, f;
string name;
int score;
while (cin >> n >> f) {
vector<pair<string, int>> grade;
for (int i = 0; i < n; ++i) {
cin >> name >> score;
grade.push_back(make_pair(name, score));
}
if (f == 1) {
stable_sort(grade.begin(), grade.end(), value_big);//升序排序
}
if (f == 0) {
stable_sort(grade.begin(), grade.end(), value_small);//降序排序
}
for (auto& v : grade)
cout << v.first << " " << v.second << endl;
}
return 0;
}