使用STL中的泛型算法sort

根据结构体中的两个字段分别进行排序:

vector中的元素为ItemData,

struct ItemData
{
 int OnLine; //1表示在线用户,2表示不在线用户
 int User_id; //用户ID
 string strName;
};


现在要对这个vector进行排序.
排序后的结果为:

先是所有在线用户排列在前面,其再根据用户ID从小到大排列;

然后是所有不在线用户,其也根据用户ID从小到大排列;

#include  < string >
#include 
< iostream >
#include 
< vector >
#include 
< iterator >
#include 
< functional >
#include 
< algorithm >

using   namespace  std;


struct  ItemData
{
    
int OnLine; //1表示在线用户,2表示不在线用户
    int User_id; //用户ID
    string strName;
}
;

typedef ItemData MyStruct;
std::vector
< MyStruct  >  vecData;
void  insertData()

    MyStruct myData; 
    myData.OnLine 
= 1;
    myData.User_id 
= 1
    myData.strName 
= "aaaaa"
    vecData.push_back(myData);

    myData.OnLine 
= 2;
myData.User_id 
= 2; myData.strName = "bbbbb"; vecData.push_back(myData);
    myData.OnLine 
= 1;
myData.User_id 
= 3; myData.strName = "CCCCC"; vecData.push_back(myData);
    myData.OnLine 
= 2;
myData.User_id 
= 4; myData.strName = "ddddd"; vecData.push_back(myData);
    myData.OnLine 
= 1;
myData.User_id 
= 5; myData.strName = "EEEEE"; vecData.push_back(myData);

    myData.OnLine 
= 2;
    myData.User_id 
= 6
    myData.strName 
= "aaaaa"
    vecData.push_back(myData);

    myData.OnLine 
= 1;
myData.User_id 
= 7; myData.strName = "bbbbb"; vecData.push_back(myData);
    myData.OnLine 
= 2;
myData.User_id 
= 8; myData.strName = "CCCCC"; vecData.push_back(myData);
    myData.OnLine 
= 1;
myData.User_id 
= 9; myData.strName = "ddddd"; vecData.push_back(myData);
    myData.OnLine 
= 2;
myData.User_id 
= 10; myData.strName = "EEEEE"; vecData.push_back(myData);

}


void  printMyStruct( const  MyStruct  & data)
{
    std::cout 
<< "OnLine:" << data.OnLine 
        
<<" ID:"<< data.User_id << ",Name:" << data.strName << std::endl;
}


// 比较函数
int  compareData( ItemData Data_first, ItemData Data_second)
{
    
if (Data_first.OnLine != Data_second.OnLine)
    
{
        
return (Data_first.OnLine == 1)?1:0;
    }

    
else
    
{
        
return (Data_first.User_id < Data_second.User_id)?1:0;
    }

}


/*相等返回0, 如果第一个参数优先,返回>0的值, 否则返回小于0的值*/
//  这个用在STL的sort函数中有点问题
int  compareData1(  ItemData Data_first, ItemData Data_second)
{
    
if(Data_first.OnLine == Data_second.OnLine)
        
return (Data_first.User_id - Data_second.User_id);
    
else if(Data_first.OnLine == 1return 1;
         
else return -1;
}


/* 先比较第一个条件,如果不相同的就直接根据他们的数值大小返回1或0,
如果第一个条件相同就比较第二个条件,根据他们的数值大小返回1或0,
*/
int compareData2(  ItemData Data_first, ItemData Data_second)
{
    if(Data_first.OnLine == Data_second.OnLine)
        return (Data_first.User_id < Data_second.User_id)?1:0;
    else
        return (Data_first.OnLine < Data_second.OnLine)?1:0;
}

int  main( int  argc,  char *  argv[])
{
    insertData(); 
    
// 输出所有元素
    for_each(vecData.begin(),vecData.end(),printMyStruct);

    
//按要求排序
    sort(vecData.begin(),vecData.end(),compareData2);

    std::cout 
<< std::endl;
    
// 输出所有元素
    for_each(vecData.begin(),vecData.end(),printMyStruct);
    
    
    
return 0;
}

 个人觉得第三个比较函数compareData2(...)好一点.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值