为什么std::equal_to很有用

Why is std::equal_to useful?

本文关键字:有用 to equal std 为什么      更新时间:2023-10-16

c++标准库提供了std::equal_to。该函数对象默认调用T类型的operator==

使用std::equal_to的好处是什么?你能提供一个std::equal_to有用的例子吗?

用于算法。它提供了一个带有操作符()的函子,因此可以通用地使用。

具体的(和人为的)示例,如注释中所要求的:

// compare two sequences and produce a third one
// having true for positions where both sequences
// have equal elements
std::transform(seq1.begin(), seq1.end(), seq2.begin(), 
               std::inserter(resul), std::equal_to<>()); 

不知道谁会需要它,但它是一个例子。

拥有std::equal_to是非常有用的,因为它允许将相等比较用作函子,这意味着它可以作为参数传递给模板和函数。这对于相等操作符==来说是不可能的,因为操作符不能作为参数传递。

考虑如何与std::inner_productstd::find_first_ofstd::unordered_map一起使用。

如今,情况并非如此。在lambdas之前,它作为==调用的函子形式很有用,用于标准算法调用。现在你可以直接写[](auto& x, auto& y) { return x == y; }

主要用于作为模板参数传递给算法。不能将操作符指定为模板形参,但可以指定函数。典型的用法是:

template <class compare = std::equal_to<>, class T, class InIter>
bool contains(InIter begin, InIter end, T value, compare cmp={}) {
  for (InIter p = begin; p != end; ++p)
    if (cmp(*p, value))
      return true;
  return false;
}

如果您有(例如)一个包含多个字段的结构,您可能需要一个比较函数,它只比较指示身份的几个特定字段,比如一个人的姓名,而忽略其他字段,比如他们当前的体重、工资等级等。在这种情况下,您可以将比较函数作为模板参数传递,并且能够只比较您关心的字段。

对于其他情况,比如搜索一个整数数组,可以使用默认的比较函数