Namensräume
Varianten
Aktionen

std::ranges::fold_left_first

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
(C++23)
fold_left_first
(C++23)  
(C++23)
(C++23)  
Operationen auf uninitialisiertem Speicher
Rückgabetypen
 
Definiert in Header <algorithm>
Aufruf-Signatur
template< std::input_iterator I, std::sentinel_for<I> S,

          /*indirekt-links-faltbar*/<std::iter_value_t<I>, I> F >
requires std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>
constexpr auto

    fold_left_first( I first, S last, F f );
(1) (seit C++23)
template< ranges::input_range R,

          /*indirekt-links-faltbar*/<
                ranges::range_value_t<R>, ranges::iterator_t<R>> F >
requires std::constructible_from<
             ranges::range_value_t<R>, ranges::range_reference_t<R>>
constexpr auto

    fold_left_first( R&& r, F f );
(2) (seit C++23)
Hilfskonzepte
template< class F, class T, class I >
concept /*indirekt-links-faltbar*/ = /* siehe Beschreibung */;
(3) (nur Exposition*)

Links (higher-order function) [Fold (higher-order function)] die Elemente des gegebenen Bereichs, d. h. gibt das Ergebnis der Auswertung des Kettenausdrucks zurück
f(f(f(f(x1, x2), x3), ...), xn), wobei x1, x2, ..., xn Elemente des Bereichs sind.

Informell verhält sich ranges::fold_left_first wie die Überladung von std::accumulate, die ein binäres Prädikat akzeptiert, mit dem Unterschied, dass *first intern als anfängliches Element verwendet wird.

Das Verhalten ist undefiniert, wenn [firstlast) kein gültiger Bereich ist.

1) Der Bereich ist [firstlast). Entspricht return ranges::fold_left_first_with_iter(std::move(first), last, f).value.
2) Wie (1), mit der Ausnahme, dass r als Bereich verwendet wird, als ob mit ranges::begin(r) als first und ranges::end(r) als last.
3) Äquivalent zu
Hilfskonzepte
template< class F, class T, class I, class U >

concept /*indirectly-binary-left-foldable-impl*/ =
    std::movable<T> &&
    std::movable<U> &&
    std::convertible_to<T, U> &&
    std::invocable<F&, U, std::iter_reference_t<I>> &&
    std::assignable_from<U&,

        std::invoke_result_t<F&, U, std::iter_reference_t<I>>>;
(3A) (nur Exposition*)
template< class F, class T, class I >

concept /*indirectly-binary-left-foldable*/ =
    std::copy_constructible<F> &&
    std::indirectly_readable<I> &&
    std::invocable<F&, T, std::iter_reference_t<I>> &&
    std::convertible_to<std::invoke_result_t<F&, T, std::iter_reference_t<I>>,
        std::decay_t<std::invoke_result_t<F&, T, std::iter_reference_t<I>>>> &&
    /*indirectly-binary-left-foldable-impl*/<F, T, I,

        std::decay_t<std::invoke_result_t<F&, T, std::iter_reference_t<I>>>>;
(3B) (nur Exposition*)

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

Inhalt

[edit] Parameter

first, last - das Iterator-Sentinel-Paar, das den Bereich der zu faltenden Elemente definiert
r - der Bereich der zu faltenden Elemente
f - das binäre Funktions-Objekt

[edit] Rückgabewert

Ein Objekt vom Typ std::optional<U>, das das Ergebnis des linken Faltens des gegebenen Bereichs über f enthält, wobei U äquivalent zu decltype(ranges::fold_left(std::move(first), last, std::iter_value_t<I>(*first), f)) ist.

Wenn der Bereich leer ist, wird std::optional<U>() zurückgegeben.

[edit] Mögliche Implementierungen

struct fold_left_first_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             /*indirectly-binary-left-foldable*/<std::iter_value_t<I>, I> F>
    requires
        std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>
    constexpr auto operator()(I first, S last, F f) const
    {
        using U = decltype(
            ranges::fold_left(std::move(first), last, std::iter_value_t<I>(*first), f)
        );
        if (first == last)
            return std::optional<U>();
        std::optional<U> init(std::in_place, *first);
        for (++first; first != last; ++first)
            *init = std::invoke(f, std::move(*init), *first);
        return std::move(init);
    }
 
    template<ranges::input_range R,
             /*indirectly-binary-left-foldable*/<
                 ranges::range_value_t<R>, ranges::iterator_t<R>> F>
    requires
        std::constructible_from<ranges::range_value_t<R>, ranges::range_reference_t<R>>
    constexpr auto operator()(R&& r, F f) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::ref(f));
    }
};
 
inline constexpr fold_left_first_fn fold_left_first;

[edit] Komplexität

Genau ranges::distance(first, last) - 1 (vorausgesetzt, der Bereich ist nicht leer) Anwendungen des Funktionsobjekts f.

[edit] Anmerkungen

Die folgende Tabelle vergleicht alle eingeschränkten Faltungsalgorithmen

Faltungs-Funktionstemplate Beginnt von Anfangswert Rückgabetyp
ranges::fold_left left init U
ranges::fold_left_first left erstes Element std::optional<U>
ranges::fold_right right init U
ranges::fold_right_last right letztes Element std::optional<U>
ranges::fold_left_with_iter left init

(1) ranges::in_value_result<I, U>

(2) ranges::in_value_result<BR, U>,

wobei BR ranges::borrowed_iterator_t<R> ist

ranges::fold_left_first_with_iter left erstes Element

(1) ranges::in_value_result<I, std::optional<U>>

(2) ranges::in_value_result<BR, std::optional<U>>

wobei BR ranges::borrowed_iterator_t<R> ist

Feature-Test-Makro Wert Std Feature
__cpp_lib_ranges_fold 202207L (C++23) std::ranges Fold-Algorithmen

[edit] Beispiel

#include <algorithm>
#include <array>
#include <functional>
#include <ranges>
#include <utility>
 
int main()
{
    constexpr std::array v{1, 2, 3, 4, 5, 6, 7, 8};
    static_assert
    (
        *std::ranges::fold_left_first(v.begin(), v.end(), std::plus{}) == 36
        && *std::ranges::fold_left_first(v, std::multiplies{}) == 40320
    );
 
    constexpr std::array w
    {
        1, 2, 3, 4, 13,
        1, 2, 3, 4, 13,
        1, 2, 3, 4, 13,
        1, 2, 3, 4,
    };
    static_assert
    (
        "Find the only value that (by precondition) occurs odd number of times:"
        && *std::ranges::fold_left_first(w, [](int p, int q){ return p ^ q; }) == 13
    );
 
    constexpr auto pairs = std::to_array<std::pair<char, float>>
    ({
        {'A', 3.0f},
        {'B', 3.5f},
        {'C', 4.0f}
    });
    static_assert
    (
        "Get the product of all pair::second in pairs:"
        && *std::ranges::fold_left_first
        (
            pairs | std::ranges::views::values, std::multiplies{}
        ) == 42
    );
}

[edit] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 27.6.18 Fold [alg.fold]

[edit] Siehe auch

Faltet einen Elementbereich von links
(Algorithmus-Funktionsobjekt)[edit]
Faltet einen Elementbereich von rechts
(Algorithmus-Funktionsobjekt)[edit]
Faltet einen Elementbereich von rechts unter Verwendung des letzten Elements als Anfangswert
(Algorithmus-Funktionsobjekt)[edit]
Faltet einen Elementbereich von links und gibt ein Paar (Iterator, Wert) zurück
(Algorithmus-Funktionsobjekt)[edit]
Faltet einen Elementbereich von links unter Verwendung des ersten Elements als Anfangswert und gibt ein Paar (Iterator, optional) zurück
(Algorithmus-Funktionsobjekt)[edit]
summiert oder faltet eine Reihe von Elementen
(Funktionstemplate) [bearbeiten]
(C++17)
ähnlich wie std::accumulate, aber nicht-sequenziell
(Funktionstemplate) [bearbeiten]