#include <stdio.h>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
int max_v(int s, int n)
{
return max(s, n);
}
int sum(int s, int n)
{
return (n % 2 == 0) ? s + n : s;
}
int sum_a(int s, int n)
{
return s + n;
}
int sq(int n)
{
return n * n;
}
int main()
{
// 初期設定
vector<int> v1 {1, 2, 3, 4, 5};
printf("v1 :");
for (auto x : v1)
printf(" %d", x);
printf("\n");
// v1 のすべての要素の部分和
printf("v1 のすべての要素の部分和(partial_sum)\n");
vector<int> v2(5); // inserter を使用しない場合は,前もって大きさを指定
partial_sum(v1.begin(), v1.end(), v2.begin());
// vector<int> v2;
// partial_sum(v1.begin(), v1.end(), inserter(v2, v2.begin()));
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の偶数要素の部分和(partial_sum,最初は v1 の 1 番目の要素と必ず一致)
printf("v1 の偶数要素の部分和(partial_sum,最初は v1 の 1 番目の要素と必ず一致)\n");
partial_sum(v1.begin(), v1.end(), v2.begin(), sum); // 関数
// partial_sum(v1.begin(), v1.end(), v2.begin(), [](int s, int n){ return (n % 2 == 0) ? s + n : s; }); // ラムダ式
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の n 番目の要素までの部分和(inclusive_scan)
printf("v1 の n 番目の要素までの部分和(inclusive_scan)\n");
inclusive_scan(v1.begin(), v1.end(), v2.begin());
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の 1 から n 番目の要素までの最大値(inclusive_scan)
printf("v1 の 1 から n 番目の要素までの最大値(inclusive_scan)\n");
inclusive_scan(v1.begin(), v1.end(), v2.begin(), [](int a, int b) { return max(a, b); });
// inclusive_scan(v1.begin(), v1.end(), v2.begin(), max_v);
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
inclusive_scan(v1.begin(), v1.end(), v2.begin(), [](int a, int b) { return max(a, b); }, 10);
// inclusive_scan(v1.begin(), v1.end(), v2.begin(), max_v, 10);
printf(" v2(初期値を10にした場合) :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の 1 から n-1 番目の要素までの最大値(exclusive_scan)
printf("v1 の 1 から n-1 番目の要素までの最大値(exclusive_scan)\n");
exclusive_scan(v1.begin(), v1.end(), v2.begin(), 0, [](int a, int b) { return max(a, b); });
// exclusive_scan(v1.begin(), v1.end(), v2.begin(), 0, max_v);
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の 1 から n 番目の要素までの 2 乗の和(transform_inclusive_scan)
printf("v1 の 1 から n 番目の要素までの 2 乗の和(transform_inclusive_scan)\n");
transform_inclusive_scan(v1.begin(), v1.end(), v2.begin(), [](int a, int b){ return a + b; }, [](int x){ return x * x; });
// transform_inclusive_scan(v1.begin(), v1.end(), v2.begin(), plus<>(), sq); // 二項関数オブジェクト plus
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の 1 から n-1 番目の要素までの 2 乗の和(transform_exclusive_scan)
printf("v1 の 1 から n-1 番目の要素までの 2 乗の和(transform_exclusive_scan)\n");
transform_exclusive_scan(v1.begin(), v1.end(), v2.begin(), 0, [](int a, int b){ return a + b; }, [](int x){ return x * x; });
// transform_exclusive_scan(v1.begin(), v1.end(), v2.begin(), 0, sum_a, sq);
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
return 0;
}