Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2016|回复: 0
打印 上一主题 下一主题

vector 排序方法sort的使用

[复制链接]

1272

主题

2067

帖子

7962

积分

认证用户组

Rank: 5Rank: 5

积分
7962
跳转到指定楼层
楼主
发表于 2020-10-28 13:14:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.cnblogs.com/tianyaju ... /05/24/2516881.html

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

  5. using namespace std;

  6. double calc_distance(double _long1,double _lat1,double _long2,double _lat2)
  7. {
  8.     double rad = 6371.0;
  9.     const double PI = 3.14159265358979323846;
  10.     double long1 = _long1/180.0*PI;
  11.     double lat1 = _lat1/180.0*PI;
  12.     double long2 = _long2/180.0*PI;
  13.     double lat2 = _lat2/180.0*PI;
  14.     return rad*(acos(cos(lat2)*cos(lat1)*cos(long2-long1)+sin(lat2)*sin(lat1)));
  15. }
  16. class User
  17. {
  18.     private:
  19.         int id;
  20.         double longitude;
  21.         double latitude;

  22.     public:
  23.         int getid(){return id;}
  24.         double getlongitude(){return longitude;}
  25.         double getlatitude(){return latitude;}
  26.     User(int _id,double _longitude,double _latitude)
  27.     {
  28.         id = _id;
  29.         longitude = _longitude;
  30.         latitude = _latitude;
  31.     }

  32.     bool operator<(const User& obj) const
  33.     {
  34.         return id < obj.id;
  35.     }

  36.     bool operator>(const User& obj) const
  37.     {
  38.         return id > obj.id;
  39.     }

  40.     friend bool sort_by_distance(const User& obj1,const User& obj2);
  41.     friend bool sort_by_id(const User& obj1,const User& obj2);
  42. };

  43. static double _longitude = 0.0;
  44. static double _latitude = 0.0;

  45. bool sort_by_distance(const User& obj1,const User& obj2)
  46. {
  47.     return calc_distance(obj1.longitude,obj1.latitude,_longitude,_latitude)< calc_distance(obj2.longitude,obj2.latitude,_longitude,_latitude);
  48. }

  49. bool sort_by_id(const User& obj1,const User& obj2)
  50. {
  51.     return obj1.id < obj2.id;
  52. }
  53. int main()
  54. {
  55.     vector<User> vect;
  56.     User test1(3,20.1,20.1);
  57.     User test2(2,30.1,30.1);
  58.     User test3(1,40.1,40.1);
  59.     User test4(4,50.1,50.1);
  60.     User test5(5,60.1,60.1);
  61.     vect.push_back(test1);
  62.     vect.push_back(test2);
  63.     vect.push_back(test3);
  64.     vect.push_back(test4);
  65.     vect.push_back(test5);
  66.     while(true)
  67.     {
  68.         if(_longitude == 0.0 && _latitude == 0.0)
  69.         {
  70.             _longitude = 30.1;
  71.             _latitude = 30.1;
  72.             break;
  73.         }
  74.     }

  75.     sort(vect.begin(),vect.end(),sort_by_distance);
  76.     //sort(vect.begin(),vect.end(),sort_by_id);
  77.     //sort(vect.begin(),vect.end(),less<User>());
  78.     //sort(vect.begin(),vect.end(),greater<User>());

  79.     _longitude = 0.0;
  80.     _latitude = 0.0;

  81.     vector<User>::iterator it = vect.begin();
  82.     while(it != vect.end())
  83.     {
  84.         cout<<"ID:"<<it->getid()<<"\tLong:"<<it->getlongitude()<<"\tLat:"<<it->getlatitude()<<endl;
  85.         it++;
  86.     }

  87. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-26 00:48 , Processed in 0.059502 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表