Effective_STL 学习笔记(十九) 了解相等和等价的区别

 

find 算法和 set 的 insert 成员函数是很多必须判断两个值是否相同的函数代表,

find 对 “相同” 的定义是相等,基于 operator== ,

set::insert 对 “相同” 的定义是等价,通常基于 operator< 。

 

操作上来说,相等的概念基于 operator== 的,如果表达式 “x == y” 返回true,x和y有相等的值,

x 和 y 相等并不意味着所有它们的成员有相等的值

 

等价是基于在一个有序区间中对象值的相对位置。等价一般在每种关联容器(set、multiset、map 和 multimap)的一部分——排序方面有意义,

两个对象 x 和 y 如果在关联容器 c 的排列顺序中没有哪个排在另一个之前,那么它们关于 c 使用的排列顺序有等价的值

对于 set<Widget> 的默认比较函数是 less<Widget>,operator<

1   !( w1 < w2 ) && !( w2 < w1 )  // w1<w2非真且w2<w1非真 

意义在于: 两个值没有哪个在另一个之前(关于某个排序标准),那么它们等价

 

一般情况下,用于关联容器的比较函数是用户定义的判断式每个关联容器通过 key_comp成员函数来访问排序判断式:

1   !c.key_comp()(x, y) && !c.key_comp()(y, x);

c.key_comp() 返回一个函数,并把 x 和 y 作为实参

 

总之,通过只定义一个比较函数并使用等价作为两个值 “相等” 的意义的仲裁者,标准关联容器避开了很多会由允许两个比较函数而引发的困难。

 

posted @ 2018-11-26 10:58  KidyCharon  阅读(417)  评论(0编辑  收藏  举报