vector 排序方法sort的使用

使用vector的sort方法,有两种形式,一种是在类内部使用操作符重载实现,一种是在类外面写一个比较函数。但是sort方法无法直接传入其它形参,在需要动态排序相对某个人的位置时,采取了间接通过静态变量的方法。为防止并发量巨大时,静态变量无法及时改变而产生错误数据,故用一循环去验证等待赋值,排完序后再还原为初始值。

  1 #include <iostream>
  2 #include <string>
  3 #include <cmath>
  4 #include <vector>
  5 
  6 using namespace std;
  7 
  8 double calc_distance(double _long1,double _lat1,double _long2,double _lat2)
  9 {
 10     double rad = 6371.0;
 11     const double PI = 3.14159265358979323846;
 12     double long1 = _long1/180.0*PI;
 13     double lat1 = _lat1/180.0*PI;
 14     double long2 = _long2/180.0*PI;
 15     double lat2 = _lat2/180.0*PI;
 16     return rad*(acos(cos(lat2)*cos(lat1)*cos(long2-long1)+sin(lat2)*sin(lat1)));
 17 }
 18 class User
 19 {
 20     private:
 21         int id;
 22         double longitude;
 23         double latitude;
 24 
 25     public:
 26         int getid(){return id;}
 27         double getlongitude(){return longitude;}
 28         double getlatitude(){return latitude;}
 29     User(int _id,double _longitude,double _latitude)
 30     {
 31         id = _id;
 32         longitude = _longitude;
 33         latitude = _latitude;
 34     }
 35     
 36     bool operator<(const User& obj) const
 37     {
 38         return id < obj.id;
 39     }
 40 
 41     bool operator>(const User& obj) const
 42     {
 43         return id > obj.id;
 44     }
 45     
 46     friend bool sort_by_distance(const User& obj1,const User& obj2);
 47     friend bool sort_by_id(const User& obj1,const User& obj2);
 48 };
 49 
 50 static double _longitude = 0.0;
 51 static double _latitude = 0.0;
 52 
 53 bool sort_by_distance(const User& obj1,const User& obj2) 
 54 {
 55     return calc_distance(obj1.longitude,obj1.latitude,_longitude,_latitude)< calc_distance(obj2.longitude,obj2.latitude,_longitude,_latitude);
 56 }
 57 
 58 bool sort_by_id(const User& obj1,const User& obj2)
 59 {
 60     return obj1.id < obj2.id;
 61 }
 62 int main()
 63 {
 64     vector<User> vect;
 65     User test1(3,20.1,20.1); 
 66     User test2(2,30.1,30.1);
 67     User test3(1,40.1,40.1);
 68     User test4(4,50.1,50.1);
 69     User test5(5,60.1,60.1);
 70     vect.push_back(test1);
 71     vect.push_back(test2);
 72     vect.push_back(test3);
 73     vect.push_back(test4);
 74     vect.push_back(test5);
 75     while(true)
 76     {
 77         if(_longitude == 0.0 && _latitude == 0.0)
 78         {
 79             _longitude = 30.1;
 80             _latitude = 30.1;
 81             break;
 82         }
 83     }
 84     
 85     sort(vect.begin(),vect.end(),sort_by_distance);
 86     //sort(vect.begin(),vect.end(),sort_by_id);
 87     //sort(vect.begin(),vect.end(),less<User>());
 88     //sort(vect.begin(),vect.end(),greater<User>());
 89 
 90     _longitude = 0.0;
 91     _latitude = 0.0;
 92 
 93     vector<User>::iterator it = vect.begin();
 94     while(it != vect.end())
 95     {
 96         cout<<"ID:"<<it->getid()<<"\tLong:"<<it->getlongitude()<<"\tLat:"<<it->getlatitude()<<endl;
 97         it++;
 98     }
 99 
100 }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值