使用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(...)好一点.
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(...)好一点.
相关文章推荐
- STL中泛型算法find_if()与sort()的应用举例及详解
- Effective STL: Item 44:优先使用与泛型算法同名的成员函数
- 使用STL中的泛型算法及函数对象
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- 算法学习 - STL的排序函数(sort)使用
- 2-2 使用模板(泛型)编写算法-Selection-Sort-Using-Template
- STL中泛型算法find_if()与sort()的应用举例及详解
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- C++ 之 高效使用STL(泛型算法设计原理解析)
- STL中泛型算法find_if()与sort()的应用举例及详解
- C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- c++ STL 算法set_union和sort
- 实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- c++ STL常用算法使用方法
- 关于利用STL中的sort算法对向量等容器进行排序的问题
- STL提供的Sort 算法
- stl学习之泛型算法