Namensräume
Varianten
Aktionen

std::ranges::starts_with

Von cppreference.com
< cpp‎ | algorithm‎ | ranges
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Eingeschränkte Algorithmen
Alle Namen in diesem Menü gehören zum Namespace std::ranges
Nicht-modifizierende Sequenzoperationen
Modifizierende Sequenzoperationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen (auf sortierten Bereichen)
       
       
Mengenoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
       
       
Permutationsoperationen
Faltoperationen
Operationen auf uninitialisiertem Speicher
Rückgabetypen
 
Definiert in Header <algorithm>
Aufruf-Signatur
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) (seit 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) (seit C++23)

Prüft, ob der zweite Bereich den Anfang des ersten Bereichs bildet.

1) Seien N1 und N2 die Größen der Bereiche [first1last1) bzw. [first2last2). Wenn N1 < N2, wird false zurückgegeben. Andernfalls wird true zurückgegeben, nur wenn jedes Element im Bereich [first2last2) gleich dem entsprechenden Element im Bereich [first1first1 + N2) ist. Der Vergleich erfolgt durch Anwendung der binären Prädikatsfunktion pred auf die durch proj1 bzw. proj2 projizierten Elemente der beiden Bereiche.
2) Entspricht (1), verwendet jedoch r1 und r2 als Quellbereiche, als ob ranges::begin(r1) als first1, ranges:begin(r2) als first2, ranges::end(r1) als last1 und ranges::end(r2) als last2 verwendet würden.

Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.

Inhalt

[bearbeiten] Parameter

first1, last1 - das Iterator-Sentinel-Paar, das den Bereich der zu untersuchenden Elemente definiert
r1 - der Bereich der zu untersuchenden Elemente
first2, last2 - das Iterator-Sentinel-Paar, das den Bereich der als Präfix zu verwendenden Elemente definiert
r2 - der als Präfix zu verwendende Bereich
pred - das binäre Prädikat, das die projizierten Elemente vergleicht
proj1 - die Projektion, die auf die Elemente des zu untersuchenden Bereichs angewendet wird
proj2 - die Projektion, die auf die Elemente des als Präfix zu verwendenden Bereichs angewendet wird

[bearbeiten] Rückgabewert

true, wenn der zweite Bereich den Anfang des ersten Bereichs bildet, andernfalls false.

[bearbeiten] Komplexität

Linear: höchstens min(N1, N2) Anwendungen des Prädikats und beider Projektionen.

[bearbeiten] Mögliche Implementierung

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 {};

[bearbeiten] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_ranges_starts_ends_with 202106L (C++23) std::ranges::starts_with, std::ranges::ends_with

[bearbeiten] Beispiel

#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)));
}

Ausgabe

true false true false

[bearbeiten] Siehe auch

Prüft, ob ein Bereich mit einem anderen Bereich endet
(Algorithmus-Funktionsobjekt)[edit]
Findet die erste Position, an der sich zwei Bereiche unterscheiden
(Algorithmus-Funktionsobjekt)[edit]
prüft, ob der String mit dem gegebenen Präfix beginnt
(öffentliche Memberfunktion von std::basic_string<CharT,Traits,Allocator>) [edit]
prüft, ob die Zeichenansicht mit dem gegebenen Präfix beginnt
(public member function of std::basic_string_view<CharT,Traits>) [edit]