您的位置:首页 > 其它

再次相遇sort, 再次的感悟

2011-10-21 10:36 155 查看
以前本人曾经在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: