众所周知,std::set和std::map的底层使用红黑树作为排序算法,并且默认是升序排列。
但是当我们的键值是一个结构体或者类的时候该怎么办呢 ?
可以看到set的模板是这样实现的,默认比较函数是std::less
![](https://img-blog.csdnimg.cn/img_convert/811847391fe72aa6e22564cce03b662a.png)
而less的底层实现是这样的
![](https://img-blog.csdnimg.cn/img_convert/61c918a118231ae20e77910e39a2efca.png)
所以,照葫芦画瓢,当我们想要使用自定义结构作为键值的时候便可以自定义一个比较函数
仅举例set,map用法相同
struct stru
{
/* data */
int a,b;
stru(int _a){a=_a;}
};
struct myCompless
{
bool operator()(const stru& first, const stru& second) const
{
//升序:first.a < second.a
//降序:first.a > second.a
return first.a < second.a;
}
};
int main(void)
{
stru stru1(7),stru2(1),stru3(9),stru4(5);
std::set<stru, myCompless> ss{stru1,stru2,stru3,stru4};
for (auto item:ss)
{
printf("%d\n",item.a);
}
return 0;
}
运行结果
升序
![](https://img-blog.csdnimg.cn/img_convert/a2a0a48a1fd53ef0c3236a9584a7f313.png)
降序
![](https://img-blog.csdnimg.cn/img_convert/535218266b2a0b35f88dff129f88be8a.png)