STL Samples : <numeric>
数値計算
- template <class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init); - template <class InputIterator, class T, class BinaryOperation> T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);
initを初期値としてシーケンス[first,last]の各要素を積算します。すなわち:
T acc = init; while ( first != last ) acc = acc + *first++; return acc;
第4引数(BinaryOperation)を渡す形式では:
T acc = init; while ( first != last ) acc = op(acc,*first++); return acc;
と等価です。
- template <class InputIterator, class OutputIterator> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); - template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
シーケンス[first,last)の隣接する要素の差を[result,…)に作ります。この結果,
*(result) = *(first) *(result+1) = *(first+1) - *(first) *(result+2) = *(first+2) - *(first+1) ...
となります。
- template <class InputIterator1, class InputIterator2, class T> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); - template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> T inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);
initを初期値とし、シーケンス[first1,last1)と[first2,…)との内積を求めます。すなわち:
T acc = init; while ( first1 != last1 ) acc = acc + (*first1++) * (*first2++) return acc;
第4,5引数(BinaryOperation)を渡す形式では:
T acc = init; while ( first1 != last1 ) acc = op1(acc, op2(*first1++, *first2++)); return acc;
と等価です。
- template <class InputIterator, class OutputIterator> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result); - template <class InputIterator, class OutputIterator, class BinaryOperation> OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op);
0 < n <= (last-first)なるnに対し、シーケンス[first,first+n)の積算値を*(result+n)に作ります。この結果,
*(result) = *(first) *(result+1) = *(first) + *(first+1) *(result+2) = *(first) + *(first+1) + *(first+2) ...
となります。
#include <iostream> #include <numeric> #include "to_string.h" using namespace std; void std_accumulate() { cout << "accumulate" << endl; const int N = 5; int input[N] = { 1,2,3,4,5 }; cout << to_string(input,input+N) << " の総和: " << accumulate(input, input+N, 0) << endl; } void std_adjacent_difference() { cout << "adjacent_difference" << endl; const int N = 5; int input[N] = { 2,3,4,5,6 }; int output[] = { 0,0,0,0,0 }; cout << to_string(input,input+5) << " の隣接要素の差: "; adjacent_difference(input, input+N, output); cout << to_string(output, output+N) << endl; } void std_inner_product() { cout << "innser_product" << endl; const int N = 5; int input1[N] = { 1,2,3,4,5 }; int input2[N] = { 1,2,3,4,5 }; cout << to_string(input1,input1+N) << " と " << to_string(input2,input2+N) << " の内積: " << inner_product(input1, input1+N, input2, 0) << endl; } void std_partial_sum() { cout << "partial_sum" << endl; const int N = 5; int input[N] = { 1,2,3,4,5 }; int output[N] = { 0,0,0,0,0 }; cout << to_string(input,input+N) << " の部分和: "; partial_sum(input, input+N, output); cout << to_string(output, output+N) << endl; }