#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int set10() { return 10; }
class set20
{
	public:
		int operator() ()
		{
			return 20;
		}
};
int sum(int &s, int &n) {
	s += n;
	n++;
	return s;
}
int main()
{
					// 初期設定
	vector<int> v1 {0, 1, 2, 3, 4, 5};
	printf("v1 :");
	for (auto x : v1)
		printf("  %d", x);
	printf("\n");
					// すべての範囲の要素を 10 にする
	printf("すべての範囲の要素を 10 にする\n");
	generate(v1.begin(), v1.end(), set10);   // 関数
//	generate(v1.begin(), v1.end(), []{ return 10; });   // ラムダ式
	printf("  v1 :");
	for (auto x : v1)
		printf("  %d", x);
	printf("\n");
					// 後ろの 3 つの要素を 20 にする
	printf("後ろの 4 つの要素を 20 にする\n");
	generate_n(v1.begin()+2, 4, set20());
//	generate_n(v1.begin()+2, 4, []{ return 20; });
	printf("  v1 :");
	for (auto x : v1)
		printf("  %d", x);
	printf("\n");
					// n 番目の要素に,1 から n までの和
	printf("n 番目の要素に,1 から n までの和\n");
	int s = 0, n = 1;
	generate(v1.begin(), v1.end(), [&s, &n]{ s += n; n++; return s; });
	printf("  v1 :");
	for (auto x : v1)
		printf("  %d", x);
	printf("\n");
	return 0;
}