2016-06-24 41 views
5

Durante la lettura di std::inclusive_scan, non sembrano esserci esempi.
Mi sembra molto simile a std::partial_sum.Qual è la differenza tra std :: partial_sum e 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); 

Qualcuno può approfondire le loro differenze? Quando dovrei scegliere l'uno rispetto all'altro?

risposta

10

documentazione di std::inclusive_scan stati:

In altre parole, le operazioni di sommatoria può essere effettuata in ordine arbitrario. Il comportamento non è determinante se binary_op non è associativo.

documentazione di std::partial_sum Stati senza alcuna riserva che:

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

Pertanto, std::inclusive_scan è equivalente a std::partial_sum solo se binary_op è associativa, cioè quando (aopb)opc = aop(bopc).

In caso di binary_op non associativo, std::partial_sum produrrà un risultato deterministico, mentre non si sa cosa aspettarsi da std::inclusive_scan.