根据结构体中的两个字段分别进行排序:
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
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
ItemData
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int OnLine; //1表示在线用户,2表示不在线用户
int User_id; //用户ID
string strName;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef ItemData MyStruct;
std::vector
<
MyStruct
>
vecData;
void
insertData()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
MyStruct myData;
myData.OnLine = 1;
myData.User_id = 1;
myData.strName = "aaaaa";
vecData.push_back(myData);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
myData.OnLine = 2;
myData.User_id = 6;
myData.strName = "aaaaa";
vecData.push_back(myData);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
printMyStruct(
const
MyStruct
&
data)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
std::cout << "OnLine:" << data.OnLine
<<" ID:"<< data.User_id << ",Name:" << data.strName << std::endl;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
比较函数
int
compareData( ItemData Data_first, ItemData Data_second)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (Data_first.OnLine != Data_second.OnLine)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return (Data_first.OnLine == 1)?1:0;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return (Data_first.User_id < Data_second.User_id)?1:0;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*相等返回0, 如果第一个参数优先,返回>0的值, 否则返回小于0的值*/
//
这个用在STL的sort函数中有点问题
int
compareData1( ItemData Data_first, ItemData Data_second)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(Data_first.OnLine == Data_second.OnLine)
return (Data_first.User_id - Data_second.User_id);
else if(Data_first.OnLine == 1) return 1;
else return -1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
/* 先比较第一个条件,如果不相同的就直接根据他们的数值大小返回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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main(
int
argc,
char
*
argv[])
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
insertData();
// 输出所有元素
for_each(vecData.begin(),vecData.end(),printMyStruct);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//按要求排序
sort(vecData.begin(),vecData.end(),compareData2);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
std::cout << std::endl;
// 输出所有元素
for_each(vecData.begin(),vecData.end(),printMyStruct);
return 0;
}
个人觉得第三个比较函数compareData2(...)好一点.