STL進階--相等 vs 等價 (Equality vs Equivalence)
阿新 • • 發佈:2019-01-01
相等性 vs 等價性
問題: 以下兩個find的結果分別指向什麼?
class Lsb_less { public: bool operator()(int x, int y) { return (x%10)<(y%10); } }; set<int, Lsb_less> s = {21, 23, 26, 27}; //自定義比較方法 set<int, Lsb_less>::iterator itr1, itr2; itr1 = find(s.begin(), s.end(), 36); // 指向s.end() itr2 = s.find(36); // 指向26
為什麼不一樣?
set<int, Lsb_less> s = {21, 23, 26, 27};
/*
* 演算法find()尋找相等性: if (x == y)
*/
itr1 = find(s.begin(), s.end(), 36); // itr1指向s.end()
/*
* set<int>::find()尋找等效性: if ( !(x<y) && !(y<x) )
*/
itr2 = s.find(36); // itr2 points to 26
總結
- 如果函式使用<運算子或類似函式,它檢查等效性。通常它是用於已排序資料的演算法,或者已排序資料容器的成員函式,如關聯容器。
如果函式使用 == 運算子或類似函式,它檢查相等性。通常不要求資料已排序。
相等性的演算法:
search
find_end
find_first_of
adjacent_search等效性的演算法:
binary_search // simple forms
includes
lower_bound
upper_bound當使用某個函式搜尋或者刪除元素時,確保你理解了相等性和等效性之間的區別。