Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::partial_sum

      From cppreference.com
      <cpp‎ |algorithm
       
       
      Algorithm library
      Constrained algorithms and algorithms on ranges(C++20)
      Constrained algorithms, e.g.ranges::copy,ranges::sort, ...
      Execution policies(C++17)
      Sorting and related operations
      Partitioning operations
      Sorting operations
      Binary search operations
      (on partitioned ranges)
      Set operations (on sorted ranges)
      Merge operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      (C++11)
      (C++17)
      Lexicographical comparison operations
      Permutation operations
      C library
      Numeric operations
      Operations on uninitialized memory
       
       
      Defined in header<numeric>
      template<class InputIt,class OutputIt>

      OutputIt partial_sum( InputIt first, InputIt last,

                            OutputIt d_first);
      (1)(constexpr since C++20)
      template<class InputIt,class OutputIt,class BinaryOp>

      OutputIt partial_sum( InputIt first, InputIt last,

                            OutputIt d_first, BinaryOp op);
      (2)(constexpr since C++20)
      1) If[firstlast) is empty, does nothing.
      Otherwise, performs the following operations in order:
      1. Creates an accumulatoracc, whose type is thevalue type ofInputIt, and initializes it with*first.
      2. Assignsacc to*d_first.
      3. For each integeri in[1std::distance(first, last)), performs the following operations in order:
      a) Computesacc+*iter(until C++20)std::move(acc)+*iter(since C++20), whereiter is the nextith iterator offirst.
      b) Assigns the result toacc.
      c) Assignsacc[1] to*dest, wheredest is the nextith iterator ofd_first.
      2) Same as(1), but computesop(acc,*iter)(until C++20)op(std::move(acc),*iter)(since C++20) instead.

      Givenbinary_op as the actual binary operation:

      • If any of the following conditions is satisfied, the program is ill-formed:
      • The value type ofInputIt is not constructible from*first.
      • acc is notwritable tod_first.
      • The result ofbinary_op(acc,*iter)(until C++20)binary_op(std::move(acc),*iter)(since C++20) is not implicitly convertible to the value type ofInputIt.
      • Givend_last as the iterator to bereturned, if any of the following conditions is satisfied, the behavior is undefined:
      • binary_op modifies any element of[firstlast) or[d_firstd_last).
      • binary_op invalidates any iterator or subrange in[firstlast] or[d_firstd_last].


      1. The actual value to be assigned is the result of the assignment in the previous step. We assume the assignment result isacc here.

      Contents

      [edit]Parameters

      first, last - the pair of iterators defining therange of elements to sum
      d_first - the beginning of the destination range; may be equal tofirst
      op - binary operation function object that will be applied.

      The signature of the function should be equivalent to the following:

       Ret fun(const Type1&a,const Type2&b);

      The signature does not need to haveconst&.
      The type Type1 must be such that an object of typestd::iterator_traits<InputIt>::value_type can be implicitly converted to Type1. The type Type2 must be such that an object of typeInputIt can be dereferenced and then implicitly converted to Type2. The typeRet must be such that an object of typeInputIt can be dereferenced and assigned a value of typeRet.​

      Type requirements
      -
      InputIt must meet the requirements ofLegacyInputIterator.
      -
      OutputIt must meet the requirements ofLegacyOutputIterator.

      [edit]Return value

      Iterator to the element past the last element written, ord_first if[firstlast) is empty.

      [edit]Complexity

      Given\(\scriptsize N\)N asstd::distance(first, last):

      1) Exactly\(\scriptsize N-1\)N-1 applications ofoperator+.
      2) Exactly\(\scriptsize N-1\)N-1 applications of the binary functionop.

      [edit]Possible implementation

      partial_sum (1)
      template<class InputIt,class OutputIt>constexpr// since C++20OutputIt partial_sum(InputIt first, InputIt last, OutputIt d_first){if(first== last)return d_first; typenamestd::iterator_traits<InputIt>::value_type sum=*first;*d_first= sum; while(++first!= last){        sum= std::move(sum)+*first;// std::move since C++20*++d_first= sum;} return++d_first; // or, since C++14:// return std::partial_sum(first, last, d_first, std::plus<>());}
      partial_sum (2)
      template<class InputIt,class OutputIt,class BinaryOp>constexpr// since C++20OutputIt partial_sum(InputIt first, InputIt last,                      OutputIt d_first, BinaryOp op){if(first== last)return d_first; typenamestd::iterator_traits<InputIt>::value_type acc=*first;*d_first= acc; while(++first!= last){        acc= op(std::move(acc),*first);// std::move since C++20*++d_first= acc;} return++d_first;}

      [edit]Notes

      acc was introduced because of the resolution ofLWG issue 539. The reason of usingacc rather than directly summing up the results (i.e.*(d_first+2)=(*first+*(first+1))+*(first+2);) is because the semantic of the latter is confusing if the following types mismatch:

      • the value type ofInputIt
      • the writable type(s) ofOutputIt
      • the types of the parameters ofoperator+ orop
      • the return type ofoperator+ orop

      acc serves as the intermediate object to store and provide the values for each step of the computation:

      • its type is the value type ofInputIt
      • it is written tod_first
      • its value is passed tooperator+ orop
      • it stores the return value ofoperator+ orop
      enum not_int{ x=1, y=2}; char i_array[4]={100,100,100,100};not_int e_array[4]={x, x, y, y};int  o_array[4]; // OK: uses operator+(char, char) and assigns char values to int arraystd::partial_sum(i_array, i_array+4, o_array); // Error: cannot assign not_int values to int arraystd::partial_sum(e_array, e_array+4, o_array); // OK: performs conversions when needed// 1. creates “acc” of type char (the value type)// 2. the char arguments are used for long multiplication (char -> long)// 3. the long product is assigned to “acc” (long -> char)// 4. “acc” is assigned to an element of “o_array” (char -> int)// 5. go back to step 2 to process the remaining elements in the input rangestd::partial_sum(i_array, i_array+4, o_array,std::multiplies<long>{});

      [edit]Example

      Run this code
      #include <functional>#include <iostream>#include <iterator>#include <numeric>#include <vector> int main(){std::vector<int> v(10,2);// v = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2} std::cout<<"The first "<< v.size()<<" even numbers are: ";// write the result to the cout stream    std::partial_sum(v.cbegin(), v.cend(),std::ostream_iterator<int>(std::cout," "));std::cout<<'\n'; // write the result back to the vector v    std::partial_sum(v.cbegin(), v.cend(),                     v.begin(),std::multiplies<int>()); std::cout<<"The first "<< v.size()<<" powers of 2 are: ";for(int n: v)std::cout<< n<<' ';std::cout<<'\n';}

      Output:

      The first 10 even numbers are: 2 4 6 8 10 12 14 16 18 20 The first 10 powers of 2 are: 2 4 8 16 32 64 128 256 512 1024

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 242C++98op could not have side effectsit cannot modify the ranges involved
      LWG 539C++98the type requirements needed for the result
      evaluations and assignments to be valid were missing
      added

      [edit]See also

      computes the differences between adjacent elements in a range
      (function template)[edit]
      sums up or folds a range of elements
      (function template)[edit]
      similar tostd::partial_sum, includes theith input element in theith sum
      (function template)[edit]
      similar tostd::partial_sum, excludes theith input element from theith sum
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/partial_sum&oldid=180316"

      [8]ページ先頭

      ©2009-2025 Movatter.jp