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判断时,会认为相同的关键字是不相等的,因此会将相同的关键字插入容器,因此其不允许非严格弱序。