2016-06-24 18 views
5

Khi đọc khoảng std::inclusive_scan, có vẻ như không có bất kỳ ví dụ nào.
Nó tấn công tôi rất giống với std::partial_sum.Sự khác nhau giữa std :: partial_sum và std :: inclusive_scan là gì?

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); 

Ai đó có thể xây dựng trên sự khác biệt của họ? Khi nào tôi sẽ chọn cái kia?

Trả lời

10

Tài liệu của std::inclusive_scan trạng thái:

Nói cách khác, các hoạt động tổng thể được thực hiện theo thứ tự tùy ý. Hành vi không xác định nếu binary_op không phải là kết hợp.

Tài liệu của std::partial_sum bang mà không đặt phòng rằng:

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

Như vậy, std::inclusive_scan tương đương với std::partial_sum chỉ khi binary_op là kết hợp, tức là khi (aopb)opc = aop(bopc).

Trong trường hợp không liên quan binary_op, std::partial_sum sẽ tạo ra kết quả xác định, trong khi bạn không biết những gì mong đợi từ std::inclusive_scan.

Các vấn đề liên quan