?
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 作為實參
?
總之,通過只定義一個比較函數并使用等價作為兩個值 “相等” 的意義的仲裁者,標準關聯容器避開了很多會由允許兩個比較函數而引發的困難。
?