根据返回的bool值判断,a是否应该在b之前。
a1与b1比较为true(a1可以在b1之前),b1与a1比较为false(b1不可以在a1之前)
a2与b2比较为false(a2不可以在b2之前),b2与a2比较为true(b2可以在a2之前)
a3与b3比较为false(a3不可以在b3之前),b3与a3比较为false(b3不可以在a3之前),没办法插入
class Person
{
public:
int sex; //0:女 1:男
int age;
};
//set的排序规则
//1.性别优先,女的在前,重复:都一样
class CmpSex
{
public:
/* 推导过程
bool operator()(const Person& a, const Person& b)
{
//YY
if (a.sex == b.sex && a.age == b.age)
{
return true;
}
//NY
if (a.sex != b.sex && a.age == b.age)
{
return a.sex < b.sex;
}
//YN
if (a.sex == b.sex && a.age != b.age)
{
return a.age < b.age;
}
//NN
if (a.sex != b.sex && a.age != b.age)
{
return a.sex < b.sex;
}
}
*/
bool operator()(const Person& a, const Person& b) const
{
//NY //NN
if (a.sex != b.sex)
{
return a.sex < b.sex;
}
//YN //YY
return a.age < b.age;
}
};
//2.年龄优先,年轻大的在前,重复 : 都一样
class CmpAge
{
public:
bool operator()(const Person& a, const Person& b) const
{
if (a.age != b.age)
{
return a.age > b.age;
}
return a.sex > a.sex;
}
};
//3.性别优先,女的在前,重复 : 按生肖算一样
class CmpShengXiao
{
public:
bool operator()(const Person& a, const Person& b) const
{
if (a.sex != b.sex)
{
return a.sex < b.sex;
}
return a.age % 12 < b.age % 12;
}
};
// 4.性别优先,女的在前,重复 : 按10岁一档
class CmpShiSui
{
public:
bool operator()(const Person& a, const Person& b) const
{
if (a.sex != b.sex)
{
return a.sex < b.sex;
}
return a.age / 10 < b.age / 10;
}
};
#include <set>
int main()
{
std::set<Person, CmpSex> sexSet;
std::set<Person, CmpAge> ageSet;
Person p1{ 1,1 };
Person p2{ 0,3 };
Person p3{ 0,6 };
Person p4{ 1,8 };
sexSet.insert(p1);
sexSet.insert(p2);
for (auto person : sexSet)
{
printf("%d ", person.sex);
}
return 0;
}