C++ 严格弱序

1.严格弱序是什么

C++的容器例如std::set,std::map等或需要实现排序算法需要实现比较函数的数据结构就要保证严格弱序,简单来说

struct Foo{
    int ID;
    int score;
    std::string name;
}

bool operator<(const Foo& lh, const Foo& rh){
    return lh.ID < rh.ID;
 }

<就是严格弱序,<=就不是严格弱序
复杂一点说严格弱序关系是定义在集合S上的满足严格偏序定义的且具有不可比关系可传递 属性的二元关系。
其具有以下四个属性:
(1) 反自反
(2) 反对称
(3) 可传递
(4) 不可比较关系可传递, 也即a与b不可比和b与c不可比则a与c不可比
对于(4), 实际上不可比较是一个等价关系,其将S划分成若干等价类,这一点其实非常重要。在我们给std::set 或 std::sort 传递的比较函数时,实际上也是将元素划分为了若干等价类。

2.为什么要使用严格弱序

cppreference-Compare中就明确要保证严格弱序,为什么要这样限制呢,不满足严格弱序会怎么样呢?用下面这个示例可以简单说明


struct Node{
    int val;
}

bool comp1(const Node& lh, const Node& rh)
{
    return lh .val < rh.val;
}

bool comp2(const Node& lh, const Node& rh)
{
return lh .val <= rh.val;
}

在这里插入图片描述

可以看出comp2在lh和rh相等的情况和comp1完全不同,也就是说任何lh和rh都认为是不相等的,特别是有序关联容器不允许存在相同的关键字,在用comp2判断时,会认为相同的关键字是不相等的,因此会将相同的关键字插入容器,因此其不允许非严格弱序。

参考链接

容器比较器的严格弱序约束
C++ 严格弱序
cppreference-compare

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值