sort的具体用法

来源:互联网 发布:nginx 错误日志格式 编辑:程序博客网 时间:2024/04/27 23:06

  玩ACM也快有一年了吧,也终于从裸C走向了C++的怀抱,怀着极大的热情,踩了无数了的坑,走到了现在,也想小试总结一下sort的用法,以备自己以后使用。为自己这么伟大,高尚的行为点一个赞。

  sort是c++里面的algorithm里面的一个函数,在这里,你可以直接用它排序。他的默认排序是升序的,不过你可以用它的排序规则实现很多排序功能的。

  bool cmp(const int &a,const int &b){

if(a!=b) return a>b;

else return a.b;

}

因为a>b,所以是降序排序,这就是一个排序规则。

那么问题来了,如果是一个结构体,该怎么排序呢?

我们先来定义一个结构体,按照他的平均值排序

struct trade{

int a;

int b;

double c;

}tr;

bool cmp(trade f1,trade f2){

if(f1.c!=f2.c) return f1.c>f2.c;

else return f1.c>f2.c;

}

这是结构体里面的降序排序,我们完全可以把>改成<来实现降序排序。

问题真的来了啊,如果里面有好几个排序规则,我们该怎么办呢?

哼,问题不大,我们可以设计一个复杂的排序规则啊。

还是以刚才的例子。

如果我们想要一个排序优先度a>b>c的降序排序规则,我们完全可以这么设置。

bool cmp(trade f1,trade f2){

if(f1.a!=f2.b) return f1.a>f2.a;

else if(f1.b!=f2.b) return f1.b>f2.b;

else if(f1.c!=f2.c) return f1.c>f2.c;

}

如果是升序规则,可以再自己定义啊。

最后再把杭电的一个排序题目的答案放出来辣;

哼哼哼;

#include<stdio.h>
#include<string>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct trade
{
 int J;
 int F;
 double avg;
};
bool cmp(trade FJ1,trade FJ2)
{
 if(FJ1.avg!=FJ2.avg)
  return FJ1.avg>FJ2.avg;
 else
  return FJ1.avg>FJ2.avg;
}
int main()
{
 int m,n,i;
 trade tr;
 vector<trade>tre;
 double sum;
 while(scanf("%d%d",&m,&n)&&(m!=-1&&n!=-1))
 {
  tre.clear();
  sum=0;
  for(i=0;i<n;i++)
  {
   scanf("%d%d",&tr.J,&tr.F);
   tr.avg=tr.J*1.0/tr.F;
   tre.push_back(tr);
  }
  sort(tre.begin(),tre.end(),cmp);
  for(i=0;i<tre.size();i++)
  {
   if(m>=tre[i].F)
   {
    sum+=tre[i].J;
    m=m-tre[i].F;
   }
   else 
   {
    sum+=tre[i].avg*m;
    break;
   }
  }
  printf("%.3lf\n",sum);
 }
}


这是一个关于容器vector和struct组合的一个应用,最后加了一个自定义排序规则,就得到了最终的结果。

yeah,finghting

0 0