2016-06-24 122 views
5

閱讀約std::inclusive_scan時,似乎沒有任何示例。
這讓我覺得跟std::partial_sum非常相似。std :: partial_sum和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); 

誰能闡述他們的區別是什麼?我什麼時候會選擇一個呢?

回答

10

std::inclusive_scan的狀態文檔:

換言之,求和操作可以以任意順序執行。 如果binary_op不是關聯的,則該行爲是不確定的。

毫無保留地的std::partial_sum狀態文檔的是:

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

因此,std::inclusive_scan相當於std::partial_sum僅當binary_op是締合,即當(a運算b)運算c = a運算(bopc)

如果是非關聯性binary_op,std::partial_sum將產生確定性結果,而您不知道從std::inclusive_scan得到的結果是什麼。

相關問題