成绩排序(sort对容器进行排序)

做了一道题,题目是:
输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩都按先录入排列在前的规则处理。
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。

 
 当看到本题目时,首先想到了关联容器map,但是我们知道关联容器map是根据key键值按字典顺序进行排序的,如果禁止map对key键值进行的自动排序,又失去了map的意义,相比也较难,所以不符合我们题目的要求。由于map中的元素数据类型为模板类型pair,因此我们可以使用vector嵌套pair作为数据类型,用make_pair输入进vector。
 
 解决了数据类型和存储数据的问题我们现在需要思考的是如何将vector中的数据按我们的需求进行排序,虽然我们可以用学过的数据结构知识自行建立排序函数,但是在C++中已经为我们准备好了一个对标准容器进行排序的函数sort!
 
 sort函数包含在头文件为的c++标准库中,排序的时间复杂度为n*log2n。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;
}

posted on 2019-07-19 13:07  YSQ0459  阅读(211)  评论(0编辑  收藏  举报

导航