C++ Academy · Les

Numerieke algoritmen: accumulate, reduce, transform_reduce

Voeg numerieke bereiken samen met accumulate, reduce en het parallelvriendelijke transform_reduce

Les 4 van 414 stappen

Numerieke algoritmen: accumulate, reduce, transform_reduce is een gratis C++ Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.

Het kopbestand <numeric>

Numerieke algoritmen werken op bereiken met getallen. Ze staan in <numeric>.

std::accumulate

De klassieke reductie. Telt standaard op — geef een aangepaste binaire bewerking door voor andere reducties.

#include <numeric>
std::vector<int> v = {1, 2, 3, 4, 5};
int sum = std::accumulate(v.begin(), v.end(), 0);
// sum = 15

Aangepaste reductie

Geef een beginwaarde en een binaire bewerking op.

int product = std::accumulate(v.begin(), v.end(), 1,
    std::multiplies<int>{});
// product = 120

Het type van de beginwaarde is belangrijk

Het type van de accumulator wordt afgeleid van de beginwaarde. Geef een 0.0 op om doubles naar een double te accumuleren.

std::vector<double> v = {1.5, 2.5, 3.5};
double sum_d = std::accumulate(v.begin(), v.end(), 0.0);    // 7.5
int    sum_i = std::accumulate(v.begin(), v.end(), 0);      // truncates to 6

std::reduce (C++17)

Net als accumulate, maar de bewerking moet associatief en commutatief zijn, zodat parallelle evaluatie mogelijk is.

#include <numeric>
#include <execution>
std::vector<int> v(1000);
int sum = std::reduce(std::execution::par,
    v.begin(), v.end(), 0);

reduce versus accumulate

Twee verschillen:

  • reduce kan parallel worden uitgevoerd
  • reduce garandeert de volgorde van de bewerkingen niet — prima voor + en *, maar problematisch voor niet-associatieve bewerkingen zoals het samenvoegen van tekenreeksen

std::transform_reduce (C++17)

Combineert een transformatie en een reductie in één doorgang. Sneller en expressiever dan een afzonderlijke transformatie plus reductie.

// Dot product
std::vector<int> a = {1, 2, 3}, b = {4, 5, 6};
int dot = std::transform_reduce(
    a.begin(), a.end(), b.begin(),
    0,
    std::plus<int>{},          // reduce
    std::multiplies<int>{}     // transform
);
// dot = 1*4 + 2*5 + 3*6 = 32

std::inner_product

De oudere tegenhanger van transform_reduce. Berekent het inwendig product (dotproduct) van twee bereiken. Minder algemeen, maar met een eenvoudigere API.

std::partial_sum

Schrijft lopende totalen naar een uitvoerbereik.

std::vector<int> v = {1, 2, 3, 4};
std::vector<int> sums(4);
std::partial_sum(v.begin(), v.end(), sums.begin());
// sums = {1, 3, 6, 10}

std::adjacent_difference

Het tegenovergestelde van partial_sum — schrijft de verschillen tussen opeenvolgende elementen.

std::vector<int> v = {1, 3, 6, 10};
std::vector<int> diffs(4);
std::adjacent_difference(v.begin(), v.end(), diffs.begin());
// diffs = {1, 2, 3, 4}

Kanttekening bij drijvende komma

Bij getallen met drijvende komma is de volgorde van accumuleren belangrijk vanwege afronding. reduce kan door de niet-gespecificeerde evaluatievolgorde iets andere resultaten geven dan accumulate.

Praktische toepassingen

Numerieke algoritmen vormen de basis voor:

  • som- en productberekeningen
  • statistische aggregaten (gemiddelde, variantie)
  • inproducten en normen in de lineaire algebra
  • cumulatieve sommen voor voorvoegselquery's

Korte controle

Welk C++17-algoritme voert een bereik parallel uit tot één reductie met één functieaanroep?

Samenvatting

<numeric> biedt accumulate, reduce, transform_reduce, partial_sum en adjacent_difference voor numerieke reducties en bewerkingen met voorvoegsels. Kies reduce voor parallellisme en accumulate voor een deterministische volgorde.

Gratis beginnen

Leer C++ met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
51
Lessen
203

Veelgestelde vragen

Is de les “Numerieke algoritmen: accumulate, reduce, transform_reduce” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “Numerieke algoritmen: accumulate, reduce, transform_reduce”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.

Wat leer ik in “Numerieke algoritmen: accumulate, reduce, transform_reduce”?

Voeg numerieke bereiken samen met accumulate, reduce en het parallelvriendelijke transform_reduce Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C++ Academy te beginnen?

Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Numerieke algoritmen: accumulate, reduce, transform_reduce”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C++ Academy?

Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Niet-wijzigende algoritmen: find, count, all_of
  2. Wijzigende algoritmen: transform, copy_if, replace
  3. Sorteren en partitioneren: sort, stable_partition
  4. Numerieke algoritmen: accumulate, reduce, transform_reduce
← Terug naar C++ Academy