为什么std :: equal_to有用?

Luk*_*řík 42 c++ c++11

C++标准库提供std::equal_to.此函数对象默认调用operator==on类型T.

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

Ser*_*eyA 38

用于算法.它提供了一个带有operator()的仿函数,因此可以一般地使用.

具体(和人为)的例子,如评论中所述:

// 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<>()); 
Run Code Online (Sandbox Code Playgroud)

不确定谁可能需要它,但这是一个例子.


Nik*_*lis 21

拥有std::equal_to非常有用,因为它允许将相等比较用作仿函数,这意味着它可以作为参数传递给模板和函数.这是使用相等运算符无法实现的,==因为运算符不能作为参数传递.

例如,考虑如何使用它std::inner_product, std::find_first_ofstd::unordered_map.


Jer*_*fin 9

它主要用作模板参数传递给算法.您不能将运算符指定为模板参数,但可以指定函数.典型用途如下:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果您(例如)某种类型的结构包含多个字段,您可能需要一个比较函数,该函数仅比较指示身份的几个特定字段(例如人名),但忽略其他字段(例如其当前权重)在这种情况下,您将该比较函数作为模板参数传递,并且只能比较您关注的字段.

对于您正在处理的其他情况,比如搜索整数数组,您可以使用默认比较函数.

  • @basav:听起来像一个错误的开发过程:忽略警告+没有代码审查. (2认同)

Lig*_*ica 8

这些天来,事实并非如此.在lambdas之前,它可用作调用的函子形式==,用于标准算法调用.现在你只是写[](auto& x, auto& y) { return x == y; }.

  • @Barry,当然是侮辱性的.但lambda要求有人真正阅读lambda,并确保它没有任何幻想.equal_to像箭一样直. (8认同)
  • 我仍然更喜欢equal_to到上面的表示法.更短,更快的掌握时间. (3认同)
  • 我不知道; 我想我的观点更多的是,如果它还不存在,那么`std :: equal_to`现在无法添加它.鉴于此后还添加了其他内容,它不符合纳入标准的门槛.从这个意义上讲,它并不"有用".但有时候你可能想要使用它. (3认同)
  • _ @Lightness Races in Orbit_`squal_to()`显然更短,意味着对lambda的语义清晰度,你必须解密.赋予事物名称,使意图更清晰. (2认同)
  • 为什么要重新发明轮子?如果已经有一个 `equal_to` 函数对象,你为什么要写一个 lambda? (2认同)