Namespaces
Variants

std::ranges::starts_with

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les ranges (C++20)
Algorithmes contraints, p. ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de modification de séquence
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur les ranges partitionnés)
Opérations d'ensemble (sur les ranges triés)
Opérations de fusion (sur les ranges triés)
Opérations sur les tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms dans ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modifiantes
Opérations de modification de séquence
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur les ranges triés)
       
       
Opérations d'ensemble (sur les ranges triés)
Opérations sur les tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
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
    starts_with( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                 Proj1 proj1 = {}, Proj2 proj2 = {} );
(1) (depuis C++23)
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
    starts_with( R1&& r1, R2&& r2, Pred pred = {},
                 Proj1 proj1 = {}, Proj2 proj2 = {} );
(2) (depuis C++23)

Vérifie si le deuxième range correspond au préfixe du premier range.

1) Soient N1 et N2 les tailles des ranges [first1last1) et [first2last2) respectivement. Si N1 < N2, retourne false. Sinon, retourne true seulement si chaque élément du range [first2last2) est égal à l'élément correspondant dans [first1first1 + N2). La comparaison est effectuée en appliquant le prédicat binaire pred aux éléments des deux ranges projetés par proj1 et proj2 respectivement.
2) Identique à (1)(1), mais utilise r1 et r2 comme ranges sources, comme si en utilisant ranges::begin(r1) comme first1, ranges:begin(r2) comme first2, ranges::end(r1) comme last1 et ranges::end(r2) comme last2.

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

Paramètres

first1, last1 - la paire itérateur-sentinelle définissant l'intervalle des éléments à examiner
r1 - l'intervalle des éléments à examiner
first2, last2 - la paire itérateur-sentinelle définissant l'intervalle des éléments à utiliser comme préfixe
r2 - l'intervalle des éléments à utiliser comme préfixe
pred - le prédicat binaire qui compare les éléments projetés
proj1 - la projection à appliquer aux éléments de l'intervalle à examiner
proj2 - la projection à appliquer aux éléments de l'intervalle à utiliser comme préfixe

Valeur de retour

true si la deuxième plage correspond au préfixe de la première plage, false sinon.

Complexité

Linéaire : au plus min ( N1, N2 ) applications du prédicat et des deux projections.

Implémentation possible

struct starts_with_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
    {
        return ranges::mismatch(std::move(first1), last1, std::move(first2), last2,
                                std::move(pred), std::move(proj1), std::move(proj2)
                               ).in2 == last2;
    }
    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::move(pred), std::move(proj1), std::move(proj2));
    }
};
inline constexpr starts_with_fn starts_with {};

Notes

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_ranges_starts_ends_with 202106L (C++23) std::ranges::starts_with , std::ranges::ends_with

Exemple

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
int main()
{
    using namespace std::literals;
    constexpr auto ascii_upper = [](char8_t c)
    {
        return u8'a' <= c && c <= u8'z' ? static_cast<char8_t>(c + u8'A' - u8'a') : c;
    };
    constexpr auto cmp_ignore_case = [=](char8_t x, char8_t y)
    {
        return ascii_upper(x) == ascii_upper(y);
    };
    static_assert(std::ranges::starts_with("const_cast", "const"sv));
    static_assert(std::ranges::starts_with("constexpr", "const"sv));
    static_assert(!std::ranges::starts_with("volatile", "const"sv));
    std::cout << std::boolalpha
              << std::ranges::starts_with(u8"Constantinopolis", u8"constant"sv,
                                          {}, ascii_upper, ascii_upper) << ' '
              << std::ranges::starts_with(u8"Istanbul", u8"constant"sv,
                                          {}, ascii_upper, ascii_upper) << ' '
              << std::ranges::starts_with(u8"Metropolis", u8"metro"sv,
                                          cmp_ignore_case) << ' '
              << std::ranges::starts_with(u8"Acropolis", u8"metro"sv,
                                          cmp_ignore_case) << '\n';
    constexpr static auto v = { 1, 3, 5, 7, 9 };
    constexpr auto odd = [](int x) { return x % 2; };
    static_assert(std::ranges::starts_with(v, std::views::iota(1)
                                            | std::views::filter(odd)
                                            | std::views::take(3)));
}

Sortie :

true false true false

Voir aussi

vérifie si une plage se termine par une autre plage
(objet fonction algorithme)
trouve la première position où deux plages diffèrent
(objet fonction algorithme)
vérifie si la chaîne commence par le préfixe donné
(fonction membre publique de std::basic_string<CharT,Traits,Allocator> )
vérifie si la vue de chaîne commence par le préfixe donné
(fonction membre publique de std::basic_string_view<CharT,Traits> )