Pourquoi std :: equal_to est-il utile?

La bibliothèque standard C ++ fournit std::equal_to . Cet object fonction appelle l’ operator== sur le type T par défaut.

Quel est l’intérêt d’utiliser std::equal_to ? Pourriez-vous fournir un exemple où std::equal_to est utile?

A utiliser dans les algorithmes. Il fournit un foncteur avec opérateur () et peut donc être utilisé de manière générique.

Exemple spécifique (et artificiel), tel que demandé dans les commentaires:

 // 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<>()); 

Je ne sais pas qui pourrait en avoir besoin, mais c’est un exemple.

Avoir std::equal_to est très utile car il permet d’utiliser la comparaison d’égalité en tant que foncteur, ce qui signifie qu’il peut être passé en argument aux modèles et aux fonctions. C’est quelque chose qui n’est pas possible avec l’opérateur d’égalité == puisque les opérateurs ne peuvent tout simplement pas être passés en tant que parameters.

Considérez, par exemple, comment il peut être utilisé avec std::inner_product , std::find_first_of et std::unordered_map std::find_first_of .

Ces jours-ci, ce n’est pas vraiment. Avant lambdas, c’était utile comme forme de foncteur d’un appel à == , à utiliser dans les appels d’algorithme standard. De nos jours, il suffit d’écrire [](auto& x, auto& y) { return x == y; } [](auto& x, auto& y) { return x == y; } .

Il est principalement destiné à être transmis en tant que paramètre de modèle à un algorithme. Vous ne pouvez pas spécifier un opérateur en tant que paramètre de modèle, mais vous pouvez spécifier une fonction. L’utilisation typique serait quelque chose comme:

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

Si vous avez (par exemple) une structure de quelque type qui contient plusieurs champs, vous pouvez souhaiter une fonction de comparaison qui compare uniquement quelques champs spécifiques indiquant l’identité, comme le nom d’une personne, mais en ignorant d’autres champs tels que leur poids actuel , niveau de rémunération, etc. Dans un tel cas, vous passeriez cette fonction de comparaison en tant que paramètre de modèle et vous ne pourrez comparer que les champs qui vous intéressent.

Pour les autres cas où, par exemple, vous recherchez un tableau d’entiers, vous pouvez utiliser la fonction de comparaison par défaut.