1. 程式人生 > >C++使用vector按多欄位排序。

C++使用vector按多欄位排序。

C++當中vector的資料型別是基本型別時,我們利用std::sort很容易排序,當我們的型別是自定義的結構體,並且我們還要實現按多欄位排序,我有兩種方法:

1.我們通過過載operator方法來實現:

本例子實現了struct中多個欄位排序

[cpp] view plaincopyprint?
  1. #include<iostream>
  2. #include<vector>
  3. #include<string>
  4. #include<algorithm>
  5. usingnamespace std;  
  6. typedefstruct _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. returntrue;  
  22. elseif(memcmp(szSTN,other.szSTN,4) > 0)  
  23. returnfalse;  
  24. if(memcmp(szLM,other.szLM,4) < 0)  
  25. returntrue;  
  26. elseif(memcmp(szLM,other.szLM,4) > 0)  
  27. returnfalse;  
  28. if(memcmp(szJSPM,other.szJSPM,4) < 0)  
  29. returntrue;  
  30. else
  31. returnfalse;  
  32.    }  
  33. //過載處↑
  34. }JOBLOG_READ_INFO, *LPJOBLOG_READ_INFO;  
  35. int main()  
  36. {  
  37.     vector<JOBLOG_READ_INFO> vecJobInfo;  
  38.     vector<JOBLOG_READ_INFO>::iterator iter;  
  39.     JOBLOG_READ_INFO tempVecJobInfo1;  
  40.     JOBLOG_READ_INFO tempVecJobInfo2;  
  41.     JOBLOG_READ_INFO tempVecJobInfo3;  
  42.     JOBLOG_READ_INFO tempVecJobInfo4;  
  43. //add the value to tempVecJobinfo1
  44.     strcpy(tempVecJobInfo1.szSTN,"001");  
  45.     strcpy(tempVecJobInfo1.szLM,"ABC");  
  46.     strcpy(tempVecJobInfo1.szJSPM,"XX1");  
  47. //add the value to tempVecJobinfo2
  48.     strcpy(tempVecJobInfo2.szSTN,"002");  
  49.     strcpy(tempVecJobInfo2.szLM,"ABC");  
  50.     strcpy(tempVecJobInfo2.szJSPM,"XX2");  
  51. //add the value to tempVecJobinfo3
  52.     strcpy(tempVecJobInfo3.szSTN,"002");  
  53.     strcpy(tempVecJobInfo3.szLM,"BBC");  
  54.     strcpy(tempVecJobInfo3.szJSPM,"XX3");  
  55. //add the value to tempVecJobinfo4
  56.     strcpy(tempVecJobInfo4.szSTN,"002");  
  57.     strcpy(tempVecJobInfo4.szLM,"BBC");  
  58.     strcpy(tempVecJobInfo4.szJSPM,"XX2");  
  59.     vecJobInfo.push_back(tempVecJobInfo3);  
  60.     vecJobInfo.push_back(tempVecJobInfo1);  
  61.     vecJobInfo.push_back(tempVecJobInfo2);  
  62.     vecJobInfo.push_back(tempVecJobInfo4);    
  63. //  vector<JOBLOG_READ_INFO>::iterator iter;     
  64. for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  65.     {  
  66.         cout << iter->szSTN   
  67.              << iter->szLM   
  68.              << iter->szJSPM   
  69.              << endl;  
  70.     }  
  71. //呼叫處↓
  72.     sort(vecJobInfo.begin(),vecJobInfo.end());  
  73. //呼叫處↑
  74.     cout<<"result of sorting is :"<<endl;  
  75. for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  76.     {  
  77.         cout << iter->szSTN   
  78.              << iter->szLM   
  79.              << iter->szJSPM   
  80.              << endl;  
  81.     }  
  82. return 0;  
  83. }  

2.我們通過函式物件來實現:

[cpp] view plaincopyprint?
  1. // VectorSortDemo.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
  2. //
  3. #include<iostream>
  4. #include<vector>
  5. #include<string>
  6. #include<algorithm>
  7. usingnamespace std;  
  8. typedefstruct _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. returntrue;  
  40. elseif(memcmp(jobLogInfo1.szSTN, jobLogInfo2.szSTN, 4) > 0)  
  41. returnfalse;  
  42. if(memcmp(jobLogInfo1.szLM,jobLogInfo2.szLM, 4) < 0)  
  43. returntrue;  
  44. elseif(memcmp(jobLogInfo1.szLM,jobLogInfo2.szLM, 4) > 0)  
  45. returnfalse;  
  46. if(memcmp(jobLogInfo1.szJSPM,jobLogInfo2.szJSPM, 4) < 0)  
  47. returntrue;  
  48. else
  49. returnfalse;  
  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. //add the value to tempVecJobinfo2
  65.     strcpy(tempVecJobInfo2.szSTN,"002");  
  66.     strcpy(tempVecJobInfo2.szLM,"ABC");  
  67.     strcpy(tempVecJobInfo2.szJSPM,"XX2");  
  68. //add the value to tempVecJobinfo3
  69.     strcpy(tempVecJobInfo3.szSTN,"002");  
  70.     strcpy(tempVecJobInfo3.szLM,"BBC");  
  71.     strcpy(tempVecJobInfo3.szJSPM,"XX3");  
  72. //add the value to tempVecJobinfo4
  73.     strcpy(tempVecJobInfo4.szSTN,"002");  
  74.     strcpy(tempVecJobInfo4.szLM,"BBC");  
  75.     strcpy(tempVecJobInfo4.szJSPM,"XX2");  
  76.     vecJobInfo.push_back(tempVecJobInfo3);  
  77.     vecJobInfo.push_back(tempVecJobInfo1);  
  78.     vecJobInfo.push_back(tempVecJobInfo2);  
  79.     vecJobInfo.push_back(tempVecJobInfo4);    
  80. //  vector<JOBLOG_READ_INFO>::iterator iter;     
  81. for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  82.     {  
  83.         cout << iter->szSTN   
  84.              << iter->szLM   
  85.              << iter->szJSPM   
  86.              << endl;  
  87.     }  
  88. //  sort(vecJobInfo.begin(),vecJobInfo.end());
  89. /*******************呼叫處↓*******************************/
  90.     sort(vecJobInfo.begin(),vecJobInfo.end(),stdSort);  
  91. /*******************呼叫處↑******************************/
  92.     cout<<"result of sorting is :"<<endl;  
  93. for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)  
  94.     {  
  95.         cout << iter->szSTN   
  96.              << iter->szLM   
  97.              << iter->szJSPM   
  98.              << endl;  
  99.     }  
  100. return 0;  
  101. }  

程式結果:

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

002BBCXX3

001ABCXX1

002ABCXX2

002BBCXX2

result of sorting is :

001ABCXX1

002ABCXX2

002BBCXX2

002BBCXX3

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

相關推薦

C++使用vector排序

C++當中vector的資料型別是基本型別時,我們利用std::sort很容易排序,當我們的型別是自定義的結構體,並且我們還要實現按多欄位排序,我有兩種方法: 1.我們通過過載operator方法來實現: 本例子實現了struct中多個欄位排序: [cpp] view

C#List Sort排序

多欄位排序的問題其實很簡單,只要實現一個自己的Comparator就可以。  例如我有一個類class Student {  public String name;  public int id;  public char gender;  public Student(S

C++ vector排序

C++當中vector的資料型別是基本型別時,我們利用std::sort很容易排序,當我們的型別是自定義的結構體,並且我們還要實現按多欄位排序,我有兩種方法: 1.我們通過過載operator方法來實現: 本例子實現了struct中多個欄位排序:

oracle的排序去重Row Number Over Partition By A B Order By C

                今天遇到需要在多條有重複欄位的記錄中選取修改日期最接近現在的欄位,如下:我想要選取CPDM,FBQD相同,KSRQ離現在最近的那條記錄,選出的記錄應該為1、2、3,而4、5、6、7應該捨棄掉。我們使用這條語句:Row_Number() Over(Partition By Cpd

jeecg中的查詢實體CriteriaQuery的排序的實現

jeecg中的查詢實體CriteriaQuery的多欄位排序的實現: 先按照orgName逆序排序,再按照name逆序排序,如下: CriteriaQuery cq = new CriteriaQuery(VAssessTeacherInfoEntity.class, da

mysql order by field 指定排序

舉個例子 a表裡有b欄位 b欄位裡有資料-1,1,2,3,4 如果想把4,2,3的排在最前面,其他的排在後面,並且保留4,2,3的順序 sql: select * from a order by FIELD(3,2,4) DESC 如果是這樣寫sql: s

python sort搭配lambda實現排序

sort的常用方法你一定都會了,但是如果要排序的物件的每個元素又含有多個元素,要按指定的內部某個元素排序該怎麼實現呢?正常是這樣來做的: >>> def return_item(item): ... return item[1] >>> pairs

mysql 排序

1、排序關鍵字 ASC:升序; DESC:降序; 2、單欄位排序 單欄位降序 SELECT * FROM USER ORDER BY id DESC; 3、多欄位排序 多欄位排序只需要新增多個排序條件,並且每個排序的條件之前用逗號分開。 SELEC

List>某個排序

對service層返回的資料進行排序 1、controller @GetMapping(value = "/per/{perId}", produces = {"application/json;c

java8 stream代替for迴圈 sort排序 group by多級排序

List<MacTicket> list = new ArrayList(); Category ctg= new Category(); ctg.setType(1);//0商品,1銷售規格 ctg.setSort(2); ctg.setInheritFlag(0);/

SQL查詢排序的最大值

1.建表 -- Create table create table FRUIT ( id VARCHAR2(20), name VARCHAR2(20), class VARCHAR2(20), count VARCHAR2(20),

sql 語句查詢 去重 保留某個排序top1

例子: create table tablename  (id int identity(1,1),attachid int,name varchar(10)) insert into tablename  values(23,'sss') insert into tabl

solr搜尋結果排序

如果想要搜尋結果按某一field排序, 而相同的field情況下匹配度高的優先 1) 使用sort 可見使用sort排序只滿足將section=3的排在前面, 但是同樣都是section為3的不符合按相似度排序 2) 應該對排序欄位加權才是正解

sql條件排序

語句:   複製程式碼 程式碼如下:   select * from [User] order by [Password] desc,Id asc 在一個條件重複的情況下,使用第二個條件排序如下:     注意這裡的第  14,15條記錄(在Password相同的情況下,

oracle中指定排序刪除重複記錄

       今天看了一下專案上的DBA針對某一模組中的業務寫的儲存過程,裡面資料清洗的過程中時常會進行排重操作,自己總結了一下oracle中排重的思路1,使用rowid來作為限制條件排重rowid與rownum的區別兩者都是偽列,rowid是物理結構上的,而rownum是邏

jqgrid排序引數

var config = { title: '選單列表', url: '@Url.Action("GetListWithPager")', mtype: 'post',

Oracle,SQL多重排序--排序

我們在查詢出資料的時候,需要根據某幾個欄位進行排序。 比如:查詢車輛的時候,根據車輛的型別或者註冊時間查詢車輛資訊,然後根據車輛的號碼排序,再根據車輛型別進行排序,再或者根據車輛的註冊時間進行排序。具體的查詢語句應該是: Sql程式碼  select hphm,

記一次排序的sql使用if語句問題

以上語句無法滿足要求 實現如下: 1、mysql和oracle都支援 SELECT department_id,orde

SQL 排序的實現

目前有表 brand ,資料如下: 注意圖中 紅色標記的地方。 現在 那麼執行下面sql語句:select brand_no ,seq_no from brand order by seq_no desc, brand_no desc; 得到的結

excel如何對資料進行同時排序條件組合和條件篩選呢

對資料的排序不僅可以是對單列或單行進行排序,還可以進行多欄位同時排序,從而達到想要的效果。excel如何對資料進行多欄位同時排序、多條件組合和多條件篩選呢如圖所示 【解決方法,教程視訊資料如下】 本教程視訊資料來源:http://edu.51cto.com/course/15404.html 完整部落格