// 30_30-6.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <list>

using namespace std;

void disp(list<int>& obj)
{
	list<int>::iterator wp;
	for (wp = obj.begin(); wp != obj.end(); wp++) {
		cout << *wp << " ";
	}
	cout << '\n';
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	list<int> t1, t2, t3;
	list<int>::iterator p;
	list<int>::reverse_iterator rp;

	cout << "-----(1)データを後ろに入れる\n";
	for (i = 0; i < 5; i++) {
		t1.push_back(i+100);
	}
	disp(t1);

	cout << "-----(2)データを前に入れる\n";
	for (i = 0; i < 5; i++) {
		t1.push_front(i+200);
	}
	disp(t1);

	cout << "-----(3)データを途中に入れる\n";
	p = t1.begin();
	for (i = 1; i <= 5; i++) {
		++p;
	}
	for (i = 0; i < 5; i++) {
		t1.insert(p, i+300);
	}
	disp(t1);

	cout << "-----(4)t1の長さと内容\n";
	cout << "t1の長さ=" << t1.size() << '\n';
	for (p = t1.begin(); p != t1.end(); p++) {
		cout << *p << " ";
	}
	cout << '\n';

	cout << "-----(5)逆進反復子処理でt1内容を後ろから表示\n";
	for (rp = t1.rbegin(); rp != t1.rend(); rp++) {
		cout << *rp << " ";
	}
	cout << '\n';

	cout << "-----(6)要素を整列(sort)して表示\n";
	t1.sort();
	disp(t1);

	cout << "-----(7)t1の先頭と末尾の要素を表示\n";
	cout << "front="  << t1.front() << '\n';
	cout << "back=" << t1.back() << '\n';

	cout << "-----(8)t2にassign関数で10個のデータ(初期値88)を設定\n";
	t2.assign(10, 88);
	disp(t2);

	cout << "-----(9)t2にt1を丸コピーし内容表示\n";
	t2 = t1;
	disp(t2);

	cout << "-----(10)t1とt2を比較する\n";
	if (t1 == t2) {
		cout << "t1 == t2である\n";
	}
	else {
		cout << "t1 != t2である\n";
	}

	cout << "-----(11)反復子処理でt2内容を変更\n";
	p = t2.begin();
	*p = 10;
	++p;
	*p = 20;
	disp(t2);

	cout << "-----(12)t2の2番目の要素(20)を削除(erase)する\n";
	p = t2.begin();
	++p;
	++p;
	t2.erase(p);
	disp(t2);

	cout << "-----(13)t2をクリア(clear)する\n";
	t2.clear();
	cout << "t2の長さ=" << t2.size() << '\n';

	cout << "-----(14)t2をempty(空)判定する\n";
	if (t2.empty()) {
		cout << "t2は空\n";
	}
	else {
		cout << "t2は空ではない\n";
	}

	cout << "-----(15)t2にt1の値を逆順に設定する\n";
	for (p = t1.begin(); p != t1.end(); p++) {
		t2.push_front(*p);
	}
	cout << "t1: ";
	disp(t1);
	cout << "t2: ";
	disp(t2);

	cout << "-----(16)t2の先頭と最後の要素を削除する\n";
	t2.pop_front();
	t2.pop_back();
	disp(t2);

	cout << "-----(17)t2のサイズを10にする\n";
	t2.resize(10);
	disp(t2);

	cout << "-----(18)t2のサイズを14にし、拡張部に-1を入れる\n";
	t2.resize(14, -1);
	disp(t2);

	cout << "-----(19)remove関数でt2の-1のデータを削除する\n";
	t2.remove(-1);
	disp(t2);

	cout << "-----(20)reverse関数でt2を逆順にする\n";
	t2.reverse();
	disp(t2);

	cout << "-----(21)現在のt1とt2の内容\n";
	cout << "t1: ";
	disp(t1);
	cout << "t2: ";
	disp(t2);

	cout << "-----(22)t1とt2を交換(swap)する\n";
	t1.swap(t2);
	cout << "t1: ";
	disp(t1);
	cout << "t2: ";
	disp(t2);

	cout << "-----(23)t1,t2,t3に新しい値を設定する\n";
	t1.clear();
	t2.clear();
	t3.clear();
	for (i = 1; i <= 5; i++) {
		t1.push_back(i*10);
		t2.push_back(i*10+5);
		t3.push_back(88);
	}
	cout << "t1: ";
	disp(t1);
	cout << "t2: ";
	disp(t2);
	cout << "t3: ";
	disp(t3);

	cout << "-----(24)t1とt2をマージ(merge)する\n";
	t1.merge(t2);
	cout << "t1: ";
	disp(t1);
	cout << "t2: ";
	disp(t2);
	cout << "t3: ";
	disp(t3);

	cout << "-----(25)t1末尾から2つ前にt3をつなぐ(splice)する\n";
	p = t1.end();
	--p;
	--p;
	t1.splice(p, t3);
	cout << "t1: ";
	disp(t1);
	cout << "t2: ";
	disp(t2);
	cout << "t3: ";
	disp(t3);

	cout << "-----(26)現在の要素数\n";
	cout << "t1の長さ=" << t1.size() << '\n';
	cout << "t2の長さ=" << t2.size() << '\n';
	cout << "t3の長さ=" << t3.size() << '\n';

	cout << "-----(27)t1の重複データを取り除く\n";
	t1.unique();
	disp(t1);

	MessageBox(NULL, _T("Check Console Window"), L"MessageBox", MB_OK);

	return 0;
}

