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
========================