C++中,自定义结构体vector的排序

时间:2021-11-08 19:45:35

C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?有两种方法,下面的例子能很好的说明:

 

  方法1:

 

  我们直接来看代码吧,比较简单,容易理解:

 

   #include "stdafx.h"

 

   #include   <vector>  

   #include   <algorIThm>

   #include <functional>

   

  using   namespace   std;  

 

  struct AssessTypeInfo

 {

    unsigned int m_uiType;   //类型ID

    char   m_szName[64];  //类型名称

    unsigned int m_uiTotal;   //总分数

 

 

   bool   operator <  (const   AssessTypeInfo&   rhs   )  const   //升序排序时必须写的函数

  {  

     return   m_uiType   <   rhs.m_uiType;

   }

 

    bool   operator >  (const   AssessTypeInfo&   rhs   )  const   //降序排序时必须写的函数

   {  

       return   m_uiType   >   rhs.m_uiType;

    }

 

}

 

int   main()  

  {  

   vector<AssessTypeInfo >   ctn   ;  

  

   AssessTypeInfo a1;

   a1.m_uiType=1;

 

   AssessTypeInfo  a2;

   a2.m_uiType=2;

AssessTypeInfo  a3;

   a3.m_uiType=3;

 

 

   ctn.push_back(a1);

   ctn.push_back(a2);

   ctn.push_back(a3);

 

   //升序排序

   sort(ctn.begin(), ctn.end(),less<AssessTypeInfo>())   ;   //或者sort(ctn.begin(), ctn.end())  默认情况为升序

   

 

   for   ( int  i=0;   i<3;   i++   )  

    printf("%d/n",ctn[i].m_uiType);  

 

 

  //降序排序

 

  sort(ctn.begin(), ctn.end(),greater<AssessTypeInfo>())   ;  

 

 

   for   ( int  i=0;   i<3;   i++   )  

    printf("%d/n",ctn[i].m_uiType);  

  

  

   return   0  ;  

  }

 

 以上方法就可以实现升序排序,输出结果为 1  2   3 

 

 降序排序结果3  2  1。

 

方法2 :  不修改结构体或类的定义部分,我们用函数对象来实现:

 

  #include "stdafx.h"

 

  #include   <vector>  

  #include   <algorithm>

  #include <functional>

   

  using   namespace   std;  

 

 struct AssessTypeInfo

{

 unsigned int m_uiType;   //类型ID

  char   m_szName[64];  //类型名称

 unsigned int m_uiTotal;   //总分数

 

};

 

 //注:下面两个函数实现为全局函数,不能为类成员。

  bool   lessmark(const   AssessTypeInfo&   s1,const   AssessTypeIn

fo&   s2)  

  {  

      return   s1.m_uiType   <   s2.m_uiType;  

  }

  bool   greatermark(const   AssessTypeInfo&   s1,const   AssessTypeInfo&   s2)  

  {  

      return   s1.m_uiType   >   s2.m_uiType;  

  }

 

int   main()            

  {  

   vector<AssessTypeInfo >   ctn   ;  

  

   AssessTypeInfo a1;

   a1.m_uiType=1;

 

   AssessTypeInfo  a2;

   a2.m_uiType=2;

 

 

   AssessTypeInfo  a3;

   a3.m_uiType=3;

 

 

   ctn.push_back(a1);

   ctn.push_back(a2);

   ctn.push_back(a3);

 

 

   sort(ctn.begin(), ctn.end(),lessmark)   ;   //升序排序

  

  

   for   ( int  i=0;   i<3;   i++   )  

    printf("%d/n",ctn[i].m_uiType);  

  

 

   sort(ctn.begin(), ctn.end(),greatermark)   ;   //降序排序

 

  

   return   0  ;  

  }

 

 

 

 以上方法就可以实现升序排序,输出结果为 1  2   3 

 

 降序排序结果3  2  1。

 

方法2是一种比较简单的方法。

 

以上两种方法您可根据您自己的需求选择,并且以上两种方法在vc++6.0环境下编译通过,也是自己在实践过程中的总结,如有不妥的地方,欢迎您指出,至于为什么这样使用,请参考 stl算法中sort 部分。

 

return 0 ; } 以上方法就可以实现升序排序,输出结果为 1 2 3 降序排序结果3 2 1。方法2是一种比较简单的方法。 以上两种方法您可根据您自己的需求选择,并且以上两种方法在vc++6.0环境下编译通过,也是自己在实践过程中的总结,如有不妥的地方,欢迎您指出,至于为什么这样使用,请参考 stl算法中sort 部分。

 

详细出处参考:http://www.itqun.net/content-detail/118345_3.html