Подтвердить что ты не робот

Почему std:: equal_to полезен?

Стандартная библиотека С++ предоставляет std::equal_to. Этот объект функции вызывает operator== по типу T по умолчанию.

В чем преимущество использования std::equal_to? Не могли бы вы привести пример, когда std::equal_to полезен?

4b9b3361

Ответ 1

Используется в алгоритмах. Он предоставляет функтор с 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<>()); 

Не уверен, кому это может понадобиться, но это пример.

Ответ 2

Наличие std::equal_to очень полезно, потому что позволяет использовать сравнение равенства в качестве функтора, а это значит, что его можно передать как аргумент шаблонам и функциям. Это то, что невозможно с оператором равенства ==, поскольку операторы просто не могут передаваться как параметры.

Рассмотрим, например, как его можно использовать с std::inner_product, std::find_first_of и std::unordered_map.

Ответ 3

Он предназначен прежде всего для передачи в качестве параметра шаблона в алгоритм. Вы не можете указать оператор как параметр шаблона, но вы можете указать функцию. Типичное использование будет примерно таким:

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;
}

Если у вас есть (например) структура какого-то типа, которая содержит несколько полей, вам может понадобиться функция сравнения, которая сравнивает только несколько определенных полей, указывающих идентификатор, например имя человека, но игнорируя другие поля, такие как их текущий вес, класс оплаты и т.д. В таком случае вы передадите эту функцию сравнения в качестве параметра шаблона и сможете сравнивать только те поля, которые вам интересны.

В других случаях, когда вы имеете дело, скажем, в поисках массива целых чисел, вы можете использовать функцию сравнения по умолчанию.

Ответ 4

В наши дни это не так. Перед лямбдами это было полезно в качестве функциональной формы вызова ==, для использования в стандартных вызовах алгоритма. В настоящее время вы просто пишете [](auto& x, auto& y) { return x == y; }.