問題3:テンプレートとSTL

この問題を解くためには…
 → 応用編第3日目参照

probex3-1.(難易度:★)

以下のプログラムで型に応じて複数定義されている関数maxを、テンプレートを用いて一つの関数にしなさい。

main.cpp
#include <iostream>
#include <string>

using namespace std;

//	整数値を比較し、大きいほうを返す関数
int max(int,int);
//	実数を比較し、大きいほうを返す関数
double max(double,double);
//	文字列を比較し、長いほうを返す関数
string max(string,string);

int main(){
	cout << max(1,2) << endl;
	cout << max(1.75,3.12) << endl;
	string s1 = "aiu",s2 = "eo";
	cout << max(s1,s2) << endl;
	return 0;
}

int max(int a,int b)
{
	if(a > b){
		return a;
	}
	return b;
}
double max(double a,double b)
{
	if(a > b){
		return a;
	}
	return b;
}
string max(string a,string b)
{
	if(a > b){
		return a;
	}
	return b;
}
実行結果
攻撃に出るため飛行
戦闘します
乗客を乗せて目的地まで飛行します。
乗客を目的地まで運びます。

probex3-2.(難易度:★★)

以下のプログラムでのクラスCollectionIntは、整数型の配列を保持し、その中から最大値と最少値を取得できるクラスである。このクラスをテンプレートを使って、double,stringなど、あらゆる型で同じ処理ができるクラス、collectionを作り、処理を書き換えなさい。

main.cpp
#include <iostream>
#include "collectionint.h"

using namespace std;

int main(){
	//	配列変数の定義
	int array[] = { 1,5,4,2,3 };
	CollectionInt* c = new CollectionInt(array,5);
	c->showArray();
	cout << "最大値 : " << c->getMax() << endl;
	cout << "最小値 : " << c->getMin() << endl;
	delete c;
	return 0;
}
collectionint.h
#ifndef _COLLECTIONINT_H_
#define _COLLECTIONINT_H_

class CollectionInt{
private:
	//	配列データ
	int* m_pArray;
	//	配列の長さ
	int m_length;
public:
	//	コンストラクタ
	CollectionInt(int* array,int length);
	//	デストラクタ
	~CollectionInt();
	//	最大値の取得
	int getMax();
	//	最小値の取得
	int getMin();
	//	成分の表示
	void showArray();
	
};

#endif // _COLLECTIONINT_H_
collection.cpp
#include "collectionint.h"
#include <iostream>

using namespace std;

//	コンストラクタ
CollectionInt::CollectionInt(int* array,int length)
{
	m_pArray = new int[length];
	m_length = length;
	for(int i = 0; i < m_length ; i++){
		m_pArray[i] = array[i];
	}
}
//	デストラクタ
CollectionInt::~CollectionInt()
{
	delete[] m_pArray;
}
int CollectionInt::getMax()
{
	int max = m_pArray[0];
	for(int i = 0; i < m_length ; i++){
		if(max < m_pArray[i]){
			max = m_pArray[i];
		}
	}
	return max;
}
int CollectionInt::getMin()
{
	int min = m_pArray[0];
	for(int i = 0; i < m_length ; i++){
		if(min > m_pArray[i]){
			min = m_pArray[i];
		}
	}
	return min;
}
void CollectionInt::showArray(){
	for(int i = 0; i < m_length ; i++){
		cout << m_pArray[i] << " ";
	}
	cout << endl;
}
実行結果
1 5 4 2 3
最大値 : 5
最小値 : 1
期待される実行結果
実数の場合
1.2 3.5 8.1 4.9 2.0 2.2
最大値 : 8.1
最小値 : 1.2

整数の場合
1 5 4 2 3
最大値 : 5
最小値 : 1