Aizu Online Judge(AOJ)が提供している「プログラミング応用」(ITP2)の3_A問題をC++で解いてみました。
ITP2では、「プログラミングのための基礎ライブラリを獲得します」とあります。トピック#3では、列に対する操作を学びます。
#3から#6は、alogrithm をインクルードして利用する機能を紹介します。全てのアルゴリズムは、データ構造の実装から切り離されています。アルゴリズムの要件(主にイテレータ)を満たせば動作します。
問題(3_A: Min-Max)
問題はリンク先をご覧ください。
最小値を求める min と最大値を求める max について学びます。
std::min, std::max について
以下は、cpprefjp 様の記事(min, max)を参考にさせていただきました。
std::min は、最小値を取得します。std::max は、最大値を取得します。
template <class T>
const T& min(const T& a, const T& b);
const T& max(const T& a, const T& b);
T min(initializer_list<T> t);
T max(initializer_list<T> t);
C++03 までは、2値の比較しかできませんでした。C++11からは、initializer_list により複数の値が指定できます(4、5行目)。
型 T が operator< で比較が可能であれば、使うことができます。
C++ プログラム例(ITP2 3_A)
与えられた3つの整数 a, b, c の最小値と最大値を出力します。 2つの値の最小値、最大値を取得して、もう一度比較しています(11行目)。
以下は、C++のプログラムです。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << min(a, min(b, c)) << " " << max(a, max(b, c)) << endl;
return 0;
}
C++11 からは、以下の11行目の表記方法が使えます。こちらの方が、やりたいことが明確に表現できています。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
cout << min({a, b, c}) << " " << max({a, b, c}) << endl;
return 0;
}
上記プログラムは、AOJ で「AC(Accepted=正解)」と判定されました。
最後に
min や max を使うことにより、多くの場合、条件文を減らすことができます。条件文が減るだけではなく、プログラムの意図がすっきりと表現できるため、積極的に使っていきたい機能だと考えています。
引き続き、ITP2 の問題を紹介していきます。