您的位置:首页 > 编程语言 > C语言/C++

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

2011-01-25 15:30 1241 查看
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

 

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

以上是两种实现方法,希望跟大家交流,不对的地方请各位“大虾”指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息