std:: equal
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
InputIt1,
class
InputIt2
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(1) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
bool
equal
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++17) |
|
template
<
class
InputIt1,
class
InputIt2,
class
BinaryPred
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(4) | (depuis C++17) |
|
template
<
class
InputIt1,
class
InputIt2
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(5) |
(depuis C++14)
(constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
bool
equal
(
ExecutionPolicy
&&
policy,
|
(6) | (depuis C++17) |
|
template
<
class
InputIt1,
class
InputIt2,
class
BinaryPred
>
bool
equal
(
InputIt1 first1, InputIt1 last1,
|
(7) |
(depuis C++14)
(constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(8) | (depuis C++17) |
Vérifie si
[
first1
,
last1
)
et une plage commençant à
first2
sont égales :
- Pour les surcharges (1-4) , la deuxième plage possède std:: distance ( first1, last1 ) éléments.
-
Pour les surcharges
(5-8)
, la deuxième plage est
[first2,last2).
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true . |
(jusqu'à C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true . |
(depuis C++20) |
Table des matières |
Paramètres
| first1, last1 | - | la paire d'itérateurs définissant la première plage d'éléments à comparer |
| first2, last2 | - | la paire d'itérateurs définissant la deuxième plage d'éléments à comparer |
| policy | - | la politique d'exécution à utiliser |
| p | - |
prédicat binaire qui renvoie
true
si les éléments doivent être traités comme égaux.
La signature de la fonction de prédicat doit être équivalente à ce qui suit : bool pred ( const Type1 & a, const Type2 & b ) ;
Bien que la signature n'ait pas besoin d'avoir
const
&
, la fonction ne doit pas modifier les objets qui lui sont passés et doit pouvoir accepter toutes les valeurs de type (éventuellement const)
|
| Exigences de type | ||
-
InputIt1, InputIt2
doivent satisfaire aux exigences de
LegacyInputIterator
.
|
||
-
ForwardIt1, ForwardIt2
doivent satisfaire aux exigences de
LegacyForwardIterator
.
|
||
-
BinaryPred
doit satisfaire aux exigences de
BinaryPredicate
.
|
||
Valeur de retour
Complexité
Soit N 1 défini comme std:: distance ( first1, last1 ) et N 2 défini comme std:: distance ( first2, last2 ) :
InputIt1
et
InputIt2
sont tous deux des
LegacyRandomAccessIterator
, et que
last1
-
first1
!
=
last2
-
first2
est
true
, aucune comparaison ne sera effectuée.
Exceptions
Les surcharges avec un paramètre de modèle nommé
ExecutionPolicy
signalent les erreurs comme suit :
-
Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.
Implémentation possible
| égal (1) |
|---|
template<class InputIt1, class InputIt2> constexpr //< depuis C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2) { for (; first1 != last1; ++first1, ++first2) if (!(*first1 == *first2)) return false; return true; } |
| égal (3) |
template<class InputIt1, class InputIt2, class BinaryPred> constexpr //< depuis C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p) { for (; first1 != last1; ++first1, ++first2) if (!p(*first1, *first2)) return false; return true; } |
| égal (5) |
namespace detail { // implémentation d'itérateur à accès aléatoire (permet une détection rapide de la taille de la plage) template<class RandomIt1, class RandomIt2> constexpr //< depuis C++20 bool equal(RandomIt1 first1, RandomIt1 last1, RandomIt2 first2, RandomIt2 last2, std::random_access_iterator_tag, std::random_access_iterator_tag) { if (last1 - first1 != last2 - first2) return false; for (; first1 != last1; ++first1, ++first2) if (!(*first1 == *first2)) return false; return true; } // implémentation d'itérateur d'entrée (nécessite une comparaison manuelle avec "last2") template<class InputIt1, class InputIt2> constexpr //< depuis C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, std::input_iterator_tag, std::input_iterator_tag) { for (; first1 != last1 && first2 != last2; ++first1, ++first2) if (!(*first1 == *first2)) return false; return first1 == last1 && first2 == last2; } } template<class InputIt1, class InputIt2> constexpr //< depuis C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) { details::equal(first1, last1, first2, last2, typename std::iterator_traits<InputIt1>::iterator_category(), typename std::iterator_traits<InputIt2>::iterator_category()); } |
| égal (7) |
namespace detail { // implémentation d'itérateur à accès aléatoire (permet une détection rapide de la taille de la plage) template<class RandomIt1, class RandomIt2, class BinaryPred> constexpr //< depuis C++20 bool equal(RandomIt1 first1, RandomIt1 last1, RandomIt2 first2, RandomIt2 last2, BinaryPred p, std::random_access_iterator_tag, std::random_access_iterator_tag) { if (last1 - first1 != last2 - first2) return false; for (; first1 != last1; ++first1, ++first2) if (!p(*first1, *first2)) return false; return true; } // implémentation d'itérateur d'entrée (doit comparer manuellement avec "last2") template<class InputIt1, class InputIt2, class BinaryPred> constexpr //< depuis C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p, std::input_iterator_tag, std::input_iterator_tag) { for (; first1 != last1 && first2 != last2; ++first1, ++first2) if (!p(*first1, *first2)) return false; return first1 == last1 && first2 == last2; } } template<class InputIt1, class InputIt2, class BinaryPred> constexpr //< depuis C++20 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p) { details::equal(first1, last1, first2, last2, p, typename std::iterator_traits<InputIt1>::iterator_category(), typename std::iterator_traits<InputIt2>::iterator_category()); } |
Notes
std::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 (depuis C++17) pour l'égalité, operator == pour le type correspondant est généralement préféré.
L'égalité séquentielle
std::equal
n'est pas garantie d'être à court-circuit. Par exemple, si la première paire d'é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.
Exemple
Le code suivant utilise
std::equal
pour tester si une chaîne est un palindrome.
#include <algorithm> #include <iomanip> #include <iostream> #include <string_view> constexpr bool is_palindrome(const std::string_view& s) { return std::equal(s.cbegin(), s.cbegin() + s.size() / 2, s.crbegin()); } void test(const std::string_view& s) { std::cout << std::quoted(s) << (is_palindrome(s) ? " is" : " is not") << " a palindrome\n"; } int main() { test("radar"); test("hello"); }
Sortie :
"radar" is a palindrome "hello" is not a palindrome
Voir aussi
|
(C++11)
|
trouve le premier élément satisfaisant des critères spécifiques
(modèle de fonction) |
|
retourne
true
si une plage est lexicographiquement inférieure à une autre
(modèle de fonction) |
|
|
trouve la première position où deux plages diffèrent
(modèle de fonction) |
|
|
recherche la première occurrence d'une plage d'éléments
(modèle de fonction) |
|
|
(C++20)
|
détermine si deux ensembles d'éléments sont identiques
(objet fonction algorithme) |
|
objet fonction implémentant
x
==
y
(modèle de classe) |
|
|
retourne la plage d'éléments correspondant à une clé spécifique
(modèle de fonction) |