C++使用vector按多字段排序。

3 篇文章 0 订阅
3 篇文章 0 订阅

C++当中vector的数据类型是基本类型时,我们利用std::sort很容易排序,当我们的类型是自定义的结构体,并且我们还要实现按多字段排序,我有两种方法:

1.我们通过重载operator方法来实现:

本例子实现了struct中多个字段排序

  1. #include<iostream>   
  2. #include<vector>   
  3. #include<string>   
  4. #include<algorithm>   
  5. using namespace std;  
  6. typedef struct _JOBLOG_READ_INFO  
  7. {  
  8.    char szSTN[4];  
  9.    char szLM[4];  
  10.    char szJSPM[4];  
  11.    _JOBLOG_READ_INFO()  
  12.    {  
  13.        memset(szSTN,0,4);  
  14.        memset(szLM,0,4);  
  15.        memset(szJSPM,0,4);  
  16.    }  
  17. //重载处↓   
  18.    bool operator < (const _JOBLOG_READ_INFO &other) const  
  19.    {  
  20.        if(memcmp(szSTN,other.szSTN,4) < 0)  
  21.            return true;  
  22.        else if(memcmp(szSTN,other.szSTN,4) > 0)  
  23.            return false;  
  24.        if(memcmp(szLM,other.szLM,4) < 0)  
  25.            return true;  
  26.        else if(memcmp(szLM,other.szLM,4) > 0)  
  27.            return false;  
  28.        if(memcmp(szJSPM,other.szJSPM,4) < 0)  
  29.            return true;  
  30.        else  
  31.            return false;  
  32.   
  33.    }  
  34. //重载处↑   
  35. }JOBLOG_READ_INFO, *LPJOBLOG_READ_INFO;  
  36. int main()  
  37. {  
  38.     vector<JOBLOG_READ_INFO> vecJobInfo;  
  39.     vector<JOBLOG_READ_INFO>::iterator iter;  
  40.     JOBLOG_READ_INFO tempVecJobInfo1;  
  41.     JOBLOG_READ_INFO tempVecJobInfo2;  
  42.     JOBLOG_READ_INFO tempVecJobInfo3;  
  43.     JOBLOG_READ_INFO tempVecJobInfo4;  
  44.     //add the value to tempVecJobinfo1   
  45.     strcpy(tempVecJobInfo1.szSTN,"001");  
  46.     strcpy(tempVecJobInfo1.szLM,"ABC");  
  47.     strcpy(tempVecJobInfo1.szJSPM,"XX1");  
  48.       
  49.     //add the value to tempVecJobinfo2   
  50.     strcpy(tempVecJobInfo2.szSTN,"002");  
  51.     strcpy(tempVecJobInfo2.szLM,"ABC");  
  52.     strcpy(tempVecJobInfo2.szJSPM,"XX2");  
  53.     //add the value to tempVecJobinfo3   
  54.     strcpy(tempVecJobInfo3.szSTN,"002");  
  55.     strcpy(tempVecJobInfo3.szLM,"BBC");  
  56.     strcpy(tempVecJobInfo3.szJSPM,"XX3");  
  57.     //add the value to tempVecJobinfo4   
  58.     strcpy(tempVecJobInfo4.szSTN,"002");  
  59.     strcpy(tempVecJobInfo4.szLM,"BBC");  
  60.     strcpy(tempVecJobInfo4.szJSPM,"XX2");  
  61.           
  62.     vecJobInfo.push_back(tempVecJobInfo3);  
  63.     vecJobInfo.push_back(tempVecJobInfo1);  
  64.     vecJobInfo.push_back(tempVecJobInfo2);  
  65.     vecJobInfo.push_back(tempVecJobInfo4);    
  66.       
  67. //  vector<JOBLOG_READ_INFO>::iterator iter;        
  68.     for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  69.     {  
  70.         cout << iter->szSTN   
  71.              << iter->szLM   
  72.              << iter->szJSPM   
  73.              << endl;  
  74.     }  
  75.        //调用处↓   
  76.     sort(vecJobInfo.begin(),vecJobInfo.end());  
  77.        //调用处↑   
  78.     cout<<"result of sorting is :"<<endl;  
  79.     for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  80.     {  
  81.         cout << iter->szSTN   
  82.              << iter->szLM   
  83.              << iter->szJSPM   
  84.              << endl;  
  85.     }  
  86.   
  87.     return 0;  
  88. }  


2.我们通过函数对象来实现:

  1. // VectorSortDemo.cpp : コンソール アプリケーションのエントリ ポイントを定義します。   
  2. //   
  3. #include<iostream>   
  4. #include<vector>   
  5. #include<string>   
  6. #include<algorithm>   
  7. using namespace std;  
  8. typedef struct _JOBLOG_READ_INFO  
  9. {  
  10.    char szSTN[4];  
  11.    char szLM[4];  
  12.    char szJSPM[4];  
  13.    _JOBLOG_READ_INFO()  
  14.    {  
  15.        memset(szSTN,0,4);  
  16.        memset(szLM,0,4);  
  17.        memset(szJSPM,0,4);  
  18.    }  
  19.   /* bool operator < (const _JOBLOG_READ_INFO &other) const 
  20.    { 
  21.        if(memcmp(szSTN,other.szSTN,4) < 0) 
  22.            return true; 
  23.        else if(memcmp(szSTN,other.szSTN,4) > 0) 
  24.            return false; 
  25.        if(memcmp(szLM,other.szLM,4) < 0) 
  26.            return true; 
  27.        else if(memcmp(szLM,other.szLM,4) > 0) 
  28.            return false; 
  29.        if(memcmp(szJSPM,other.szJSPM,4) < 0) 
  30.            return true; 
  31.        else 
  32.            return false; 
  33.    }*/  
  34. }JOBLOG_READ_INFO, *LPJOBLOG_READ_INFO;  
  35. //判断标准的定义↓   
  36. bool stdSort(const JOBLOG_READ_INFO& jobLogInfo1, const JOBLOG_READ_INFO& jobLogInfo2)  
  37. {  
  38.     if(memcmp(jobLogInfo1.szSTN, jobLogInfo2.szSTN, 4) < 0)  
  39.         return true;  
  40.     else if(memcmp(jobLogInfo1.szSTN, jobLogInfo2.szSTN, 4) > 0)  
  41.                 return false;  
  42.     if(memcmp(jobLogInfo1.szLM,jobLogInfo2.szLM, 4) < 0)  
  43.         return true;  
  44.     else if(memcmp(jobLogInfo1.szLM,jobLogInfo2.szLM, 4) > 0)  
  45.         return false;  
  46.     if(memcmp(jobLogInfo1.szJSPM,jobLogInfo2.szJSPM, 4) < 0)  
  47.          return true;  
  48.     else  
  49.         return false;  
  50. }  
  51. //判断标准的定义↑   
  52. int main()  
  53. {  
  54.     vector<JOBLOG_READ_INFO> vecJobInfo;  
  55.     vector<JOBLOG_READ_INFO>::iterator iter;  
  56.     JOBLOG_READ_INFO tempVecJobInfo1;  
  57.     JOBLOG_READ_INFO tempVecJobInfo2;  
  58.     JOBLOG_READ_INFO tempVecJobInfo3;  
  59.     JOBLOG_READ_INFO tempVecJobInfo4;  
  60.     //add the value to tempVecJobinfo1   
  61.     strcpy(tempVecJobInfo1.szSTN,"001");  
  62.     strcpy(tempVecJobInfo1.szLM,"ABC");  
  63.     strcpy(tempVecJobInfo1.szJSPM,"XX1");  
  64.       
  65.     //add the value to tempVecJobinfo2   
  66.     strcpy(tempVecJobInfo2.szSTN,"002");  
  67.     strcpy(tempVecJobInfo2.szLM,"ABC");  
  68.     strcpy(tempVecJobInfo2.szJSPM,"XX2");  
  69.     //add the value to tempVecJobinfo3   
  70.     strcpy(tempVecJobInfo3.szSTN,"002");  
  71.     strcpy(tempVecJobInfo3.szLM,"BBC");  
  72.     strcpy(tempVecJobInfo3.szJSPM,"XX3");  
  73.     //add the value to tempVecJobinfo4   
  74.     strcpy(tempVecJobInfo4.szSTN,"002");  
  75.     strcpy(tempVecJobInfo4.szLM,"BBC");  
  76.     strcpy(tempVecJobInfo4.szJSPM,"XX2");  
  77.           
  78.     vecJobInfo.push_back(tempVecJobInfo3);  
  79.     vecJobInfo.push_back(tempVecJobInfo1);  
  80.     vecJobInfo.push_back(tempVecJobInfo2);  
  81.     vecJobInfo.push_back(tempVecJobInfo4);    
  82.       
  83. //  vector<JOBLOG_READ_INFO>::iterator iter;        
  84.     for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  85.     {  
  86.         cout << iter->szSTN   
  87.              << iter->szLM   
  88.              << iter->szJSPM   
  89.              << endl;  
  90.     }  
  91. //  sort(vecJobInfo.begin(),vecJobInfo.end());   
  92. /*******************调用处↓*******************************/  
  93.     sort(vecJobInfo.begin(),vecJobInfo.end(),stdSort);  
  94. /*******************调用处↑******************************/   
  95.     cout<<"result of sorting is :"<<endl;  
  96.     for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  97.     {  
  98.         cout << iter->szSTN   
  99.              << iter->szLM   
  100.              << iter->szJSPM   
  101.              << endl;  
  102.     }  
  103.     return 0;  
  104. }  
 

 

程序结果:

=========================

002BBCXX3

001ABCXX1

002ABCXX2

002BBCXX2

result of sorting is :

001ABCXX1

002ABCXX2

002BBCXX2

002BBCXX3

 

========================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值