您的位置:首页 > 其它

使用STL中的泛型算法sort

2006-10-14 23:47 435 查看
根据结构体中的两个字段分别进行排序:

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(...)好一点.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐