根据结构体中的两个字段分别进行排序:
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;
}
个人觉得第三个比较函数compareData2(...)好一点.