书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!

再次相遇sort, 再次的感悟

以前本人曾经在CSDN上面发表过一篇关于sort的用法的文章。

现在摘录如下:

sort 函数是经常要用到的高级函数,用到好处,你会感觉你真的很棒!

但是,第一个问题就是,你十分了解sort函数吗?其实不然。

如果你就不彻底了解它,怎能用好呢?现在让我小露一手吧!

我们可以自定义sort函数呢,当然,它要和结构体共同使用,那样更爽,

它的这个功能主要用在多级排序上,方便死了。

例如:

struct student

{

       char name;

       int x, y, z;

}stu[1000];

bool check(strdent a, student b)

{

      if(a.x > b.x)return true;

      if(a.x == b.x  &&  a.y > b.y) return true;

      return false;

}

int main()

{

     int n;

     cin>>n;

     for(int i=0; i<n; i++)

     cin>>stu[i].name>>stu[i].x>>stu[i].y>>stu[i].z;

     sort(stu, stu+n, check)

     .........

}

怎么样,有点收获吧。

当然,我所知道是有限的,不可能很全面,还望高手指点几招。

然而,今天又做了一个题目,又遇到了新的问题,下面做出说明。

题目是这样的:

Description 在对字符串的排序中,往往具有不同的规则来判断字符串的大小先后。这里有两种比较常见的规则: 1. 首先按字符串长度进行排序,对长度相同的字符串,按字母顺序进行排序。如:ab, gdh, c, gaa, caa排序后的结果是:c, ab, caa, gaa, gdh 2. 直接按字母顺序排序,把长度不同的串都按相同长度处理。如:ab, gdh, c, gaa, caa排序后的结果是:ab, c, caa, gaa, gdh 你的任务是写一个程序,对于输入的字符串,按照这两种方式分别进行排序。
Input 只有一组测试数据,测试数据包括多行: 第一行是字符串个数N,接下来的N行为字符串,字符串均为大小写字母,不需判错。见sample input
Output输出为两行,按要求输出字符串排序后的结果,第一行为上面第一种方法,第二行为第二种方法。每两个字符串中以一个空格间隔开。见sample output

Sample Input

5
ab
gdh
c
gaa
caa

Sample Output

c ab caa gaa gdh
ab c caa gaa gdh

显然,这个是一个十分简单的题目,用上面的方法,立即
就可以解决,但是要说明的是,当你自定义了一个Check
函数以后,就不能用sort原来自身的比较功能。要想用的
话,必须再次定义一下。不然,连编译都通不过。
下面贴出我的样例代码(是通过了的)
#include "iostream"
#include "string"
#include "cstring"
#include "algorithm"
using namespace std;
struct str
{
	string substr;
}allstr[1001];
bool Check(str s1, str s2) //这个就是用来解决第一种排序了
{
	if(s1.substr.length() < s2.substr.length()) return true;
	if(s1.substr.length()==s2.substr.length() && s1.substr.compare(s2.substr)<0) return true;
	return false;
}
bool Check1(str s1, str s2) //这个就是sort函数自身所带有功能,但是,在这里还要重新定义一下,不然不可用
{
	if(s1.substr.compare(s2.substr) < 0) return true;
	return false;
}
int main()
{
	int Case;
	cin>>Case;
	for(int i=0; i<Case; i++)
		cin>>allstr[i].substr;
	sort(allstr, allstr+Case, Check);
	for(int i=0; i<Case-1; i++)
		cout<<allstr[i].substr<<" ";
	cout<<allstr[Case-1].substr<<endl;
	sort(allstr, allstr+Case, Check1);
	for(int i=0; i<Case-1; i++)
		cout<<allstr[i].substr<<" ";
	cout<<allstr[Case-1].substr<<endl;
}

posted on 2011-10-21 10:36  More study needed.  阅读(432)  评论(0编辑  收藏  举报

导航

书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!