2016-06-24 3 views
5

En lisant environ std::inclusive_scan, il ne semble y avoir aucun exemple.
Il me semble très similaire à std::partial_sum.Quelle est la différence entre std :: partial_sum et std :: inclusive_scan?

partial_sum:

template< class InputIt, class OutputIt > 
OutputIt partial_sum(InputIt first, 
         InputIt last, OutputIt d_first); 

inclusive_scan:

template< class InputIt, class OutputIt > 
OutputIt inclusive_scan(InputIt first, 
         InputIt last, OutputIt d_first); 

Quelqu'un peut-il expliquer leurs différences? Quand est-ce que je choisirais l'un plutôt que l'autre?

Répondre

10

Documentation des std::inclusive_scan états:

En d'autres termes, les opérations de sommation peut être effectuée dans un ordre arbitraire. Le comportement est non déterministe si binary_op n'est pas associatif.

Documentation des std::partial_sum états sans réserve que:

*(d_first+k) = *first + *(first+1) + ... + *(first+k); 

Ainsi, std::inclusive_scan équivaut à std::partial_sum que si binary_op est associative, à savoir quand (aopb)opc = aop(bopc).

Dans le cas de binary_op non associatif, std::partial_sum produira un résultat déterministe, alors que vous ne savez pas à quoi s'attendre de std::inclusive_scan.