// 31_31-5.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <vector>
#include <algorithm>

using namespace std;

int sum;

void disp_i(int *d, int n)
{
	for (int i = 0; i < n; i++) {
		cout << *d++ << " ";
	}
	cout << '\n';
}

void disp_v(vector<int>& obj)
{
	vector<int>::iterator p;
	for (p = obj.begin(); p != obj.end(); p++) {
		cout << *p << " ";
	}
	cout << '\n';
}

int bai_func(int n)
{
	return n * 2;
}

int add_func(int n1, int n2)
{
	return n1 + n2;
}

void mysum(int n)
{
	sum += n;
}

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int>::iterator vp;

	int n1[6] = { 10, 20, 30, 40, 50, 60 };
	int n2[6] = { 1, 2, 3, 4, 5, 6};
	int n3[6];
	vector<int> v1(n1, n1+6);
	vector<int> v2(n2, n2+6);
	vector<int> v3;

	cout << "-----(1a)n1の先頭4要素をn3にcopyする\n";
	copy(n1, n1+4, n3);
	cout << "n1: ";
	disp_i(n1, 6);
	cout << "n3: ";
	disp_i(n3, 4);

	cout << "-----(1b)v1の先頭4要素をv3にcopyする\n";
	v3.resize(4);
	vp = v1.begin();
	copy(vp, vp+4, v3.begin());
	cout << "v1: ";
	disp_v(v1);
	cout << "v3: ";
	disp_v(v3);
	
	cout << "-----(2a)n1の各要素を2倍してn3に書き込む\n";
	transform(n1, n1+6, n3, bai_func);
	cout << "n1: ";
	disp_i(n1, 6);
	cout << "n3: ";
	disp_i(n3, 6);	
	
	cout << "-----(2b)v1の各要素を2倍してv3に書き込む\n";
	v3.resize(6);
	transform(v1.begin(), v1.end(), v3.begin(), bai_func);
	cout << "v1: ";
	disp_v(v1);
	cout << "v3: ";
	disp_v(v3);
	
	cout << "-----(3a)n1の各要素を2倍して自分自身に書き込む\n";
	transform(n1, n1+6, n1, bai_func);
	cout << "n1: ";
	disp_i(n1, 6);
	
	cout << "-----(3b)v1の各要素を2倍して自分自身に書き込む\n";
	transform(v1.begin(), v1.end(), v1.begin(), bai_func);
	cout << "v1: ";
	disp_v(v1);
	
	cout << "-----(4a)n1とn2の各要素を加算してn3に書き込む\n";
	transform(n1, n1+6, n2, n3, add_func);
	cout << "n1: ";
	disp_i(n1, 6);
	cout << "n2: ";
	disp_i(n2, 6);
	cout << "n3: ";
	disp_i(n3, 6);	
	
	cout << "-----(4b)v1とv2の各要素を加算してn3に書き込む\n";
	v3.resize(6);
	transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), add_func);
	cout << "v1: ";
	disp_v(v1);
	cout << "v2: ";
	disp_v(v2);
	cout << "v3: ";
	disp_v(v3);
	
	cout << "-----(5a)n1の全要素に関数mysumを適用する\n";
	sum = 0;
	for_each(n1, n1+6, mysum);
	cout << "n1の合計=" << sum << '\n';
	
	cout << "-----(5b)v1の全要素に関数mysumを適用する\n";
	sum = 0;
	for_each(v1.begin(), v1.end(), mysum);
	cout << "v1の合計=" << sum << '\n';

	MessageBox(NULL, _T("Check Console Window"), L"MessageBox", MB_OK);

	return 0;
}

