std::ranges::is_sorted
| Défini dans l'en-tête <algorithm>
|
||
| Signature d'appel |
||
template< std::forward_iterator I, std::sentinel_for<I> S,
class Proj = std::identity,
std::indirect_strict_weak_order<std::projected<I, Proj>>
Comp = ranges::less >
constexpr bool
is_sorted( I first, S last, Comp comp = {}, Proj proj = {} );
|
(1) | (depuis C++20) |
template< ranges::forward_range R, class Proj = std::identity,
std::indirect_strict_weak_order<
std::projected<ranges::iterator_t<R>, Proj>>
Comp = ranges::less >
constexpr bool
is_sorted( R&& r, Comp comp = {}, Proj proj = {} );
|
(2) | (depuis C++20) |
Vérifie si les éléments de la plage [first, last) sont triés dans un ordre non décroissant.
Une séquence est triée par rapport à un comparateur comp si pour tout itérateur it pointant vers la séquence et tout entier non négatif n tel que it + n est un itérateur valide pointant vers un élément de la séquence, std::invoke(comp, std::invoke(proj, *(it + n)), std::invoke(proj, *it)) est évalué à false.
comp.r comme plage source, comme si ranges::begin(r) était utilisé comme first et ranges::end(r) comme last.Les entités de type fonction décrites sur cette page sont des objets de fonction d'algorithme (informellement appelés niebloids), c'est-à-dire :
- Les listes explicites d'arguments de modèle ne peuvent pas être spécifiées lors de l'appel de l'un d'entre eux.
- Aucun d'entre eux n'est visible par la recherche dépendante des arguments.
- Lorsque l'un d'entre eux est trouvé par la recherche non qualifiée normale comme nom à gauche de l'opérateur d'appel de fonction, la recherche dépendante des arguments est inhibée.
Paramètres
| first, last | - | la paire itérateur-sentinelle définissant la plage d'éléments à vérifier si elle est triée |
| r | - | la plage d'éléments à vérifier si elle est triée |
| comp | - | fonction de comparaison à appliquer aux éléments projetés |
| proj | - | projection à appliquer aux éléments |
Valeur de retour
true
si les éléments dans la plage sont triés selon
comp
.
Complexité
Linéaire en fonction de la distance entre first et last .
Implémentation possible
struct is_sorted_fn { template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less> constexpr bool operator()(I first, S last, Comp comp = {}, Proj proj = {}) const { return ranges::is_sorted_until(first, last, comp, proj) == last; } template<ranges::forward_range R, class Proj = std::identity, std::indirect_strict_weak_order< std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less> constexpr bool operator()(R&& r, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); } }; inline constexpr is_sorted_fn is_sorted; |
Notes
ranges::is_sorted
renvoie
true
pour les plages vides et les plages de longueur un.
Exemple
#include <algorithm> #include <array> #include <functional> #include <iostream> #include <iterator> int main() { namespace ranges = std::ranges; std::array digits {3, 1, 4, 1, 5}; ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(digits) ? std::cout << ": trié\n" : std::cout << ": non trié\n"; ranges::sort(digits); ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(ranges::begin(digits), ranges::end(digits)) ? std::cout << ": trié\n" : std::cout << ": non trié\n"; ranges::reverse(digits); ranges::copy(digits, std::ostream_iterator<int>(std::cout, " ")); ranges::is_sorted(digits, ranges::greater {}) ? std::cout << ": trié (avec 'greater')\n" : std::cout << ": non trié\n"; }
Sortie :
3 1 4 1 5 : non trié 1 1 3 4 5 : trié 5 4 3 1 1 : trié (avec 'greater')
Voir aussi
(C++20) |
trouve la plus grande sous-plage triée (objet fonction d'algorithme) |
(C++11) |
vérifie si une plage est triée (modèle de fonction) |