std::is_partitioned
Depuis fr.cppreference.net
< cpp | algorithme
| Défini dans l'en-tête <algorithm>
|
||
template< class InputIt, class UnaryPred >
bool is_partitioned( InputIt first, InputIt last, UnaryPred p );
|
(1) | (depuis C++11) (constexpr depuis C++20) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
bool is_partitioned( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, UnaryPred p );
|
(2) | (depuis C++17) |
1) Vérifie si
[first, last) est partitionné par le prédicat p : tous les éléments satisfaisant p apparaissent avant tous ceux qui ne le satisfont pas.2) Identique à (1), mais exécuté selon
policy. Cette surcharge participe à la résolution de surcharge uniquement si la valeur de l'expression suivante est
true :
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage d'éléments à examiner |
| policy | - | la politique d'exécution à utiliser |
| p | - | prédicat unaire qui renvoie true pour les éléments censés se trouver au début de la plage. L'expression |
| Exigences de type | ||
-InputIt doit satisfaire les exigences de LegacyInputIterator.
| ||
-ForwardIt doit satisfaire les exigences de LegacyForwardIterator. et son type valeur doit être convertible en le type de paramètre de UnaryPred.
| ||
-UnaryPred doit satisfaire les exigences de Predicate.
| ||
Valeur de retour
truetrue si les éléments e de [first, last) sont partitionnés par rapport à l'expression p(e). falsefalse sinon.
Complexité
Au plus std::distance(first, last) applications de p.
Exceptions
La surcharge avec un paramètre template nommé ExecutionPolicy signale 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 toute 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
template<class InputIt, class UnaryPred>
bool is_partitioned(InputIt first, InputIt last, UnaryPred p)
{
for (; first != last; ++first)
if (!p(*first))
break;
for (; first != last; ++first)
if (p(*first))
return false;
return true;
}
|
Exemple
Exécuter ce code
#include <algorithm>
#include <array>
#include <iostream>
int main()
{
std::array<int, 9> v {1, 2, 3, 4, 5, 6, 7, 8, 9};
auto is_even = [](int i) { return i % 2 == 0; };
std::cout.setf(std::ios_base::boolalpha);
std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
std::partition(v.begin(), v.end(), is_even);
std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
std::reverse(v.begin(), v.end());
std::cout << std::is_partitioned(v.cbegin(), v.cend(), is_even) << ' ';
std::cout << std::is_partitioned(v.crbegin(), v.crend(), is_even) << '\n';
}
Sortie :
false true false true
Voir aussi
| divise une plage d'éléments en deux groupes (modèle de fonction & objet fonction d'algorithme) | |
(C++20) |
|
(C++11) |
localise le point de partition d'une plage partitionnée (modèle de fonction & objet fonction d'algorithme) |
(C++20) |
|
(C++20) |
détermine si la plage est partitionnée par le prédicat donné (objet fonction d'algorithme) |