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

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;
}

[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



========================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: