Namespaces
Variants

std::exclusive_scan

Von de.cppreference.net
 
 
Algorithmus-Bibliothek
Eingeschränkte Algorithmen und Algorithmen über Bereiche (C++20)
Eingeschränkte Algorithmen, z. B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Batch-Operationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Swap-Operationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
 
Definiert in Header <numeric>
template< class InputIt, class OutputIt, class T >
OutputIt exclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, T init );
(1) (seit C++17)
(constexpr seit C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class T >
ForwardIt2 exclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, T init );
(2) (seit C++17)
template< class InputIt, class OutputIt,
          class T, class BinaryOp >
OutputIt exclusive_scan( InputIt first, InputIt last,
                         OutputIt d_first, T init, BinaryOp op );
(3) (seit C++17)
(constexpr seit C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2,
          class T, class BinaryOp >
ForwardIt2 exclusive_scan( ExecutionPolicy&& policy,
                           ForwardIt1 first, ForwardIt1 last,
                           ForwardIt2 d_first, T init, BinaryOp op );
(4) (seit C++17)
1) Äquivalent zu exclusive_scan(first, last, d_first, init, std::plus<>().
3) Berechnet die exklusive Präfixsumme mittels op.
Für jede ganze Zahl i in [0, std::distance(first, last)) werden die folgenden Operationen in dieser Reihenfolge ausgeführt:
  1. Erzeugt eine Sequenz, die aus init gefolgt von den Elementen von [first, iter) in dieser Reihenfolge besteht, wobei iter der nächste i-te Iterator von first ist.
  2. Berechnet die verallgemeinerte nichtkommutative Summe der Sequenz über op.
  3. Weist das Ergebnis *dest zu, wobei dest der nächste i-te Iterator von d_first ist.
2,4) Wie (1,3), jedoch ausgeführt gemäß policy.
Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(seit C++20)

Die verallgemeinerte nichtkommutative Summe einer Folge von Elementen über eine binäre Operation binary_op ist wie folgt definiert:

  • Wenn die Folge nur ein Element enthält, ist die Summe der Wert des Elements.
  • Andernfalls werden die folgenden Operationen in dieser Reihenfolge ausgeführt:
  1. Wählen Sie zwei beliebige benachbarte Elemente elem1 und elem2 aus der Folge.
  2. Berechnen Sie binary_op(elem1, elem2) und ersetzen Sie die beiden Elemente in der Folge durch das Ergebnis.
  3. Wiederholen Sie die Schritte 1 und 2, bis nur noch ein Element in der Folge vorhanden ist.


Gegeben binary_op als die tatsächliche binäre Operation:

  • Das Ergebnis ist nicht deterministisch, wenn die binary_op nicht assoziativ ist (wie z. B. Gleitkomma-Addition).
  • Wenn einer der folgenden Werte nicht in T konvertierbar ist, ist das Programm fehlerhaft:
  • binary_op(init, *first)
  • binary_op(init, init)
  • binary_op(*first, *first)
  • Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
  • T ist nicht MoveConstructible.
  • binary_op modifiziert irgendein Element von [first, last).
  • binary_op macht irgendeinen Iterator oder Teilbereich von [first, last] ungültig.

Parameter

first, last - das Iteratorpaar, das den Bereich der zu summierenden Elemente definiert
d_first - der Beginn des Zielbereichs; darf gleich first
sein policy - die zu verwendende Ausführungsrichtlinie
init - der Anfangswert
op - binäres Funktionsobjekt, das auf das Ergebnis des Dereferenzierens der Eingabeiteratoren, die Ergebnisse anderer op und init
angewendet wird
Typanforderungen
InputIt- muss die Anforderungen von LegacyInputIterator
erfüllen.
OutputIt- muss die Anforderungen von LegacyOutputIterator
erfüllen.
ForwardIt1, ForwardIt2- muss die Anforderungen von LegacyForwardIterator

erfüllen.

Rückgabewert

Iterator zum Element hinter dem zuletzt geschriebenen Element.

KomplexitätN als std::distance(first, last):

1,2) O(N) Anwendungen von std::plus<>().
3,4) O(N) Anwendungen von op.

Ausnahmen

Die Überladungen mit einem Vorlagenparameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Beispiel

#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main()
{
    std::vector data{3, 1, 4, 1, 5, 9, 2, 6};
    
    std::cout << "Exclusive sum: ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        0);
    
    std::cout << "\nInclusive sum: ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "));
    
    std::cout << "\n\nExclusive product: ";
    std::exclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        1, std::multiplies<>{});
    
    std::cout << "\nInclusive product: ";
    std::inclusive_scan(data.begin(), data.end(),
                        std::ostream_iterator<int>(std::cout, " "),
                        std::multiplies<>{});
}

Ausgabe:

Exclusive sum: 0 3 4 8 9 14 23 25
Inclusive sum: 3 4 8 9 14 23 25 31

Exclusive product: 1 3 3 12 12 60 540 1080
Inclusive product: 3 3 12 12 60 540 1080 6480

Siehe auch

berechnet die Differenzen zwischen benachbarten Elementen in einem Bereich
(Funktionsvorlage)
summiert oder faltet einen Bereich von Elementen
(Funktionsvorlage)
berechnet die partielle Summe eines Bereichs von Elementen
(Funktionsvorlage)
wendet ein aufrufbares Objekt an und berechnet dann den exklusiven Scan
(Funktionsvorlage)
ähnlich wie std::partial_sum, schließt das i-te Eingabeelement in die i-te Summe ein
(Funktionsvorlage)