// 31_31-4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cctype>

using namespace std;

void disp_v(vector<char> &obj)
{
	vector<char>::iterator p;
	for (p = obj.begin(); p != obj.end(); p++) {
		cout << *p;
	}
	cout << '\n';
}

// 反復子の示す区間[p1,p2)を表示する
void disp_v2(vector<char>::iterator p1, vector<char>::iterator p2)
{
	for (; p1 != p2; p1++) {
		cout << *p1;
	}
	cout << '\n';
}

bool is_even(char ch)
{
	if (isdigit(ch) && ch%2 == 0) {
		return 1;
	}
	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char *cp;
	int slen;
	vector<char>::iterator vp;

	char s1[] = "ABCABCabcde12345";
	char s2[40];
	vector<char> v1(s1, s1+strlen(s1));
	vector<char> v2(40);

	slen = strlen(s1);

	cout << "-----(1)現在の内容\n";
	cout << "s1: " << s1 << '\n';
	cout << "v1: ";
	disp_v(v1);

	cout << "-----(2)replace_copyでCを-に置換し相手先にコピー\n";
	cp = replace_copy(s1, s1+slen, s2, 'C', '-');
	*cp = '\0';
	vp = replace_copy(v1.begin(), v1.end(), v2.begin(), 'C', '-');
	cout << "s2: " << s2 << '\n';
	cout << "v2: ";
	disp_v2(v2.begin(), vp);

	cout << "-----(3)replaceで自分自身のCを-に変換\n";
	replace(s1, s1+slen, 'C', '-');
	replace(v1.begin(), v1.end(), 'C', '-');
	cout << "s1: " << s1 << '\n';
	cout << "v1: ";
	disp_v(v1);

	cout << "-----(4)replace_copy_ifで偶数数字を'.'に置換し相手にコピー\n";
	cp = replace_copy_if(s1, s1+slen, s2, is_even, '.');
	*cp = '\0';
	vp = replace_copy_if(v1.begin(), v1.end(), v2.begin(), is_even, '.');
	cout << "s2: " << s2 << '\n';
	cout << "v2: ";
	disp_v2(v2.begin(), vp);

	cout << "-----(5)replace_ifで自分自身の偶数数字を'.'に置換\n";
	replace_if(s1, s1+slen, is_even, '.');
	replace_if(v1.begin(), v1.end(), is_even, '.');
	cout << "s1: " << s1 << '\n';
	cout << "v1: ";
	disp_v(v1);

	cout << "-----(6)remove_copyで'.'を削除し相手先にコピー\n";
	cp = remove_copy(s1, s1+slen, s2, '.');
	*cp = '\0';
	vp = remove_copy(v1.begin(), v1.end(), v2.begin(), '.');
	cout << "s2: " << s2 << '\n';
	cout << "v2: ";
	disp_v2(v2.begin(), vp);

	cout << "-----(7)removeで自分自身の'.'を削除\n";
	cp = remove(s1, s1+slen, '.');
	*cp = '\0';
	slen = strlen(s1);
	cout << "s1: " << s1 << '\n';
	vp = remove(v1.begin(), v1.end(), '.');
	v1.erase(vp, v1.end());
	cout << "v1: ";
	disp_v(v1);

	cout << "-----(8)remove_copy_ifで小文字を削除し相手先にコピー\n";
	cp = remove_copy_if(s1, s1+slen, s2, ::islower);
	*cp = '\0';
	cout << "s2: " << s2 << '\n';
	vp = remove_copy_if(v1.begin(), v1.end(), v2.begin(), ::islower);
	v2.erase(vp, v2.end());
	cout << "v2: ";
	disp_v(v2);

	cout << "-----(9)remove_ifで自分自身の小文字を削除\n";
	cp = remove_if(s1, s1+slen, ::islower);
	*cp = '\0';
	cout << "s1: " << s1 << '\n';
	vp = remove_if(v1.begin(), v1.end(), ::islower);
	v1.erase(vp, v1.end());
	cout << "v1: ";
	disp_v(v1);

	MessageBox(NULL, _T("Check Console Window"), L"MessageBox", MB_OK);

	return 0;
}

