根据结构体中的两个字段分别进行排序:
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 == 1) return 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;
}
#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 == 1) return 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(...)好一点.