C++當中vector的數據類型是基本類型時,我們利用std::sort很容易排序,當我們的類型是自定義的結構體,並且我們還要實現按多字段排序,我有兩種方法:
1.我們通過重載operator方法來實現:
本例子實現了struct中多個字段排序:
- #include<iostream>
- #include<vector>
- #include<string>
- #include<algorithm>
- using namespace std;
- typedef struct _JOBLOG_READ_INFO
- {
- char szSTN[4];
- char szLM[4];
- char szJSPM[4];
- _JOBLOG_READ_INFO()
- {
- memset(szSTN,0,4);
- memset(szLM,0,4);
- memset(szJSPM,0,4);
- }
- //重載處↓
- bool operator < (const _JOBLOG_READ_INFO &other) const
- {
- if(memcmp(szSTN,other.szSTN,4) < 0)
- return true;
- else if(memcmp(szSTN,other.szSTN,4) > 0)
- return false;
- if(memcmp(szLM,other.szLM,4) < 0)
- return true;
- else if(memcmp(szLM,other.szLM,4) > 0)
- return false;
- if(memcmp(szJSPM,other.szJSPM,4) < 0)
- return true;
- else
- return false;
- }
- //重載處↑
- }JOBLOG_READ_INFO, *LPJOBLOG_READ_INFO;
- int main()
- {
- vector<JOBLOG_READ_INFO> vecJobInfo;
- vector<JOBLOG_READ_INFO>::iterator iter;
- JOBLOG_READ_INFO tempVecJobInfo1;
- JOBLOG_READ_INFO tempVecJobInfo2;
- JOBLOG_READ_INFO tempVecJobInfo3;
- JOBLOG_READ_INFO tempVecJobInfo4;
- //add the value to tempVecJobinfo1
- strcpy(tempVecJobInfo1.szSTN,"001");
- strcpy(tempVecJobInfo1.szLM,"ABC");
- strcpy(tempVecJobInfo1.szJSPM,"XX1");
- //add the value to tempVecJobinfo2
- strcpy(tempVecJobInfo2.szSTN,"002");
- strcpy(tempVecJobInfo2.szLM,"ABC");
- strcpy(tempVecJobInfo2.szJSPM,"XX2");
- //add the value to tempVecJobinfo3
- strcpy(tempVecJobInfo3.szSTN,"002");
- strcpy(tempVecJobInfo3.szLM,"BBC");
- strcpy(tempVecJobInfo3.szJSPM,"XX3");
- //add the value to tempVecJobinfo4
- strcpy(tempVecJobInfo4.szSTN,"002");
- strcpy(tempVecJobInfo4.szLM,"BBC");
- strcpy(tempVecJobInfo4.szJSPM,"XX2");
- vecJobInfo.push_back(tempVecJobInfo3);
- vecJobInfo.push_back(tempVecJobInfo1);
- vecJobInfo.push_back(tempVecJobInfo2);
- vecJobInfo.push_back(tempVecJobInfo4);
- // vector<JOBLOG_READ_INFO>::iterator iter;
- for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)
- {
- cout << iter->szSTN
- << iter->szLM
- << iter->szJSPM
- << endl;
- }
- //調用處↓
- sort(vecJobInfo.begin(),vecJobInfo.end());
- //調用處↑
- cout<<"result of sorting is :"<<endl;
- for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)
- {
- cout << iter->szSTN
- << iter->szLM
- << iter->szJSPM
- << endl;
- }
- return 0;
- }
2.我們通過函數對象來實現:
- // VectorSortDemo.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
- //
- #include<iostream>
- #include<vector>
- #include<string>
- #include<algorithm>
- using namespace std;
- typedef struct _JOBLOG_READ_INFO
- {
- char szSTN[4];
- char szLM[4];
- char szJSPM[4];
- _JOBLOG_READ_INFO()
- {
- memset(szSTN,0,4);
- memset(szLM,0,4);
- memset(szJSPM,0,4);
- }
- /* bool operator < (const _JOBLOG_READ_INFO &other) const
- {
- if(memcmp(szSTN,other.szSTN,4) < 0)
- return true;
- else if(memcmp(szSTN,other.szSTN,4) > 0)
- return false;
- if(memcmp(szLM,other.szLM,4) < 0)
- return true;
- else if(memcmp(szLM,other.szLM,4) > 0)
- return false;
- if(memcmp(szJSPM,other.szJSPM,4) < 0)
- return true;
- else
- return false;
- }*/
- }JOBLOG_READ_INFO, *LPJOBLOG_READ_INFO;
- //判斷標準的定義↓
- bool stdSort(const JOBLOG_READ_INFO& jobLogInfo1, const JOBLOG_READ_INFO& jobLogInfo2)
- {
- if(memcmp(jobLogInfo1.szSTN, jobLogInfo2.szSTN, 4) < 0)
- return true;
- else if(memcmp(jobLogInfo1.szSTN, jobLogInfo2.szSTN, 4) > 0)
- return false;
- if(memcmp(jobLogInfo1.szLM,jobLogInfo2.szLM, 4) < 0)
- return true;
- else if(memcmp(jobLogInfo1.szLM,jobLogInfo2.szLM, 4) > 0)
- return false;
- if(memcmp(jobLogInfo1.szJSPM,jobLogInfo2.szJSPM, 4) < 0)
- return true;
- else
- return false;
- }
- //判斷標準的定義↑
- int main()
- {
- vector<JOBLOG_READ_INFO> vecJobInfo;
- vector<JOBLOG_READ_INFO>::iterator iter;
- JOBLOG_READ_INFO tempVecJobInfo1;
- JOBLOG_READ_INFO tempVecJobInfo2;
- JOBLOG_READ_INFO tempVecJobInfo3;
- JOBLOG_READ_INFO tempVecJobInfo4;
- //add the value to tempVecJobinfo1
- strcpy(tempVecJobInfo1.szSTN,"001");
- strcpy(tempVecJobInfo1.szLM,"ABC");
- strcpy(tempVecJobInfo1.szJSPM,"XX1");
- //add the value to tempVecJobinfo2
- strcpy(tempVecJobInfo2.szSTN,"002");
- strcpy(tempVecJobInfo2.szLM,"ABC");
- strcpy(tempVecJobInfo2.szJSPM,"XX2");
- //add the value to tempVecJobinfo3
- strcpy(tempVecJobInfo3.szSTN,"002");
- strcpy(tempVecJobInfo3.szLM,"BBC");
- strcpy(tempVecJobInfo3.szJSPM,"XX3");
- //add the value to tempVecJobinfo4
- strcpy(tempVecJobInfo4.szSTN,"002");
- strcpy(tempVecJobInfo4.szLM,"BBC");
- strcpy(tempVecJobInfo4.szJSPM,"XX2");
- vecJobInfo.push_back(tempVecJobInfo3);
- vecJobInfo.push_back(tempVecJobInfo1);
- vecJobInfo.push_back(tempVecJobInfo2);
- vecJobInfo.push_back(tempVecJobInfo4);
- // vector<JOBLOG_READ_INFO>::iterator iter;
- for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)
- {
- cout << iter->szSTN
- << iter->szLM
- << iter->szJSPM
- << endl;
- }
- // sort(vecJobInfo.begin(),vecJobInfo.end());
- /*******************調用處↓*******************************/
- sort(vecJobInfo.begin(),vecJobInfo.end(),stdSort);
- /*******************調用處↑******************************/
- cout<<"result of sorting is :"<<endl;
- for(iter = vecJobInfo.begin(); iter != vecJobInfo.end();iter++)
- {
- cout << iter->szSTN
- << iter->szLM
- << iter->szJSPM
- << endl;
- }
- return 0;
- }
程序結果:
=========================
002BBCXX3
001ABCXX1
002ABCXX2
002BBCXX2
result of sorting is :
001ABCXX1
002ABCXX2
002BBCXX2
002BBCXX3
========================