C++使用vector按多字段排序。
2013-09-30 09:41
483 查看
C++当中vector的数据类型是基本类型时,我们利用std::sort很容易排序,当我们的类型是自定义的结构体,并且我们还要实现按多字段排序,我有两种方法:
1.我们通过重载operator方法来实现:
本例子实现了struct中多个字段排序:
[cpp] view plaincopyprint?
#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;
}
程序结果:
=========================
002BBCXX3
001ABCXX1
002ABCXX2
002BBCXX2
result of sorting is :
001ABCXX1
002ABCXX2
002BBCXX2
002BBCXX3
========================
1.我们通过重载operator方法来实现:
本例子实现了struct中多个字段排序:
[cpp] view plaincopyprint?
#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;
}
[cpp] view plaincopyprint? // 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; } // 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
========================
相关文章推荐
- C++使用vector按多字段排序。
- C++ vector多字段排序
- 实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- 实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- C++ vector容器使用 排序
- C++ vector容器使用 排序
- c++中vector的pair与make_pair的使用,双关键字排序
- 关于C++中vector和set使用sort方法进行排序
- 实战c++中的vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)
- 实战c++中的vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)
- C++ STL 有关于SET集合部分 的自定义数据类型的排序 以及 pair的使用
- C++文本查询程序 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- (转载自老骆驼)C++中的vector简单使用范例
- C++中的vector简单使用范例
- c/c++中排序的使用之—qsort
- 使用C++实现Vector
- 数据查询使用数字代替字段排序
- C++中vector容器类型的使用方法
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++中vector的使用