STL进阶--相等 vs 等价 (Equality vs Equivalence)

Posted logchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL进阶--相等 vs 等价 (Equality vs Equivalence)相关的知识,希望对你有一定的参考价值。

相等性 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

  • 当使用某个函数搜索或者删除元素时,确保你理解了相等性和等效性之间的区别。







以上是关于STL进阶--相等 vs 等价 (Equality vs Equivalence)的主要内容,如果未能解决你的问题,请参考以下文章

STL进阶--vector vs deque

测试浮点相等性。 (FE_FLOATING_POINT_EQUALITY)

为啥这些 C++ STL 无序集不被视为相等?

深入探讨关联容器的“等价”机制

C 等价于 C++ STL [重复]

STL 中 boost::upgrade_to_unique_lock 的等价物是啥?