Namespaces
Variants

std::ranges:: equal

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
Défini dans l'en-tête <algorithm>
Signature d'appel
template < std:: input_iterator I1, std:: sentinel_for < I1 > S1,

std:: input_iterator I2, std:: sentinel_for < I2 > S2,
class Pred = ranges:: equal_to ,
class Proj1 = std:: identity , class Proj2 = std:: identity >
requires std:: indirectly_comparable < I1, I2, Pred, Proj1, Proj2 >
constexpr bool
equal ( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = { } ,

Proj1 proj1 = { } , Proj2 proj2 = { } ) ;
(1) (depuis C++20)
template < ranges:: input_range R1, ranges:: input_range R2,

class Pred = ranges:: equal_to ,
class Proj1 = std:: identity , class Proj2 = std:: identity >
requires std:: indirectly_comparable < ranges:: iterator_t < R1 > , ranges:: iterator_t < R2 > ,
Pred, Proj1, Proj2 >
constexpr bool

equal ( R1 && r1, R2 && r2, Pred pred = { } , Proj1 proj1 = { } , Proj2 proj2 = { } ) ;
(2) (depuis C++20)
1) Retourne true si les valeurs projetées de la plage [ first1 , last1 ) sont égales aux valeurs projetées de la plage [ first2 , last2 ) , et false sinon.
2) Identique à (1) , mais utilise r comme plage source, comme si on utilisait ranges:: begin ( r ) comme first et ranges:: end ( r ) comme last .

Deux plages sont considérées égales si elles ont le même nombre d'éléments et si chaque paire d'éléments projetés correspondants satisfait pred . C'est-à-dire que std:: invoke ( pred, std:: invoke ( proj1, * first1 ) , std:: invoke ( proj2, * first2 ) ) renvoie true pour toutes les paires d'éléments correspondants dans les deux plages.

Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithme (informellement appelés niebloids ), c'est-à-dire :

Table des matières

Paramètres

first1, last1 - la paire itérateur-sentinelle définissant la première plage d'éléments à comparer
r1 - la première plage des éléments à comparer
first2, last2 - la paire itérateur-sentinelle définissant la seconde plage d'éléments à comparer
r2 - la seconde plage des éléments à comparer
pred - prédicat binaire à appliquer aux éléments projetés
proj1 - projection à appliquer à la première plage d'éléments
proj2 - projection à appliquer à la seconde plage d'éléments

Valeur de retour

Si la longueur de la plage [ first1 , last1 ) n'est pas égale à la longueur de la plage [ first2 , last2 ) , retourne false .

Si les éléments des deux plages sont égaux après projection, retourne true .

Sinon, retourne false .

Notes

ranges::equal ne doit pas être utilisé pour comparer les plages formées par les itérateurs de std::unordered_set , std::unordered_multiset , std::unordered_map , ou std::unordered_multimap car l'ordre dans lequel les éléments sont stockés dans ces conteneurs peut être différent même si les deux conteneurs stockent les mêmes éléments.

Lors de la comparaison de conteneurs entiers ou de vues de chaînes pour l'égalité, operator == pour le type correspondant sont généralement préférés.

ranges::equal n'est pas garanti d'être à court-circuit. Par exemple, si les premiers éléments des deux plages ne sont pas égaux, le reste des éléments peut également être comparé. Une comparaison sans court-circuit peut se produire lorsque les plages sont comparées avec std::memcmp ou des algorithmes vectorisés spécifiques à l'implémentation.

Complexité

Au plus min ( last1 - first1, last2 - first2 ) applications du prédicat et des projections correspondantes.

Cependant, si S1 et S2 modélisent tous deux std::sized_sentinel_for pour leurs itérateurs respectifs, et si last1 - first1 ! = last2 - first2 alors aucune application du prédicat n'est effectuée (la différence de taille est détectée sans examiner aucun élément).

Implémentation possible

struct equal_fn
{
  template<std::input_iterator I1, std::sentinel_for<I1> S1,
           std::input_iterator I2, std::sentinel_for<I2> S2,
           class Pred = ranges::equal_to,
           class Proj1 = std::identity, class Proj2 = std::identity>
  requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
  constexpr bool
      operator()(I1 first1, S1 last1, I2 first2, S2 last2,
                 Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) const
  {
      if constexpr (std::sized_sentinel_for<S1, I1> and std::sized_sentinel_for<S2, I2>)
          if (std::ranges::distance(first1, last1) != std::ranges::distance(first2, last2))
              return false;
      for (; first1 != last1; ++first1, (void)++first2)
          if (!std::invoke(pred, std::invoke(proj1, *first1), std::invoke(proj2, *first2)))
              return false;
      return true;
  }
  template<ranges::input_range R1, ranges::input_range R2,
           class Pred = ranges::equal_to,
           class Proj1 = std::identity, class Proj2 = std::identity>
  requires std::indirectly_comparable<ranges::iterator_t<R1>, ranges::iterator_t<R2>,
                                      Pred, Proj1, Proj2>
  constexpr bool
      operator()(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {}) const
  {
      return (*this)(ranges::begin(r1), ranges::end(r1),
                     ranges::begin(r2), ranges::end(r2),
                     std::ref(pred), std::ref(proj1), std::ref(proj2));
  }
};
inline constexpr equal_fn equal;

Exemple

Le code suivant utilise ranges::equal pour tester si une chaîne de caractères est un palindrome.

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>
constexpr bool is_palindrome(const std::string_view s)
{
    namespace views = std::views;
    auto forward = s | views::take(s.size() / 2);
    auto backward = s | views::reverse | views::take(s.size() / 2);
    return std::ranges::equal(forward, backward);
}
void test(const std::string_view s)
{
    std::cout << std::quoted(s) << " is "
              << (is_palindrome(s) ? "" : "not ")
              << "a palindrome\n";
}
int main()
{
    test("radar");
    test("hello");
    static_assert(is_palindrome("ABBA") and not is_palindrome("AC/DC"));
}

Sortie :

"radar" is a palindrome
"hello" is not a palindrome

Voir aussi

trouve le premier élément satisfaisant des critères spécifiques
(objet fonction algorithme)
retourne true si une plage est lexicographiquement inférieure à une autre
(objet fonction algorithme)
trouve la première position où deux plages diffèrent
(objet fonction algorithme)
recherche la première occurrence d'une plage d'éléments
(objet fonction algorithme)
retourne la plage d'éléments correspondant à une clé spécifique
(objet fonction algorithme)
objet fonction implémentant x == y
(modèle de classe)
détermine si deux ensembles d'éléments sont identiques
(modèle de fonction)