【C++】ratio_equal()関数の使い方とサンプルコードを徹底解説
本記事では、C++ STLに用意されているratio_equal()テンプレートの仕組み、構文、そして具体的な使用例について詳しく解説します。
ratio_equalテンプレートとは?
ratio_equalは、C++ STLの<ratio>ヘッダーファイルで定義されている組み込みテンプレートです。このテンプレートは、2つの比率(ratio)が等しいかどうかを比較するために使用されます。
たとえば、「1/2」と「3/6」という2つの比率を考えてみましょう。これらは約分すると同じ値になりますが、表記上の数値そのものは異なります。このように、見た目が違っても値として等しい比率を判定するために、C++ではratio_equalテンプレートが提供されています。2つの比率が等しければtrueを、等しくなければfalseを返します。
2つの比率の等価性を確認したい場合、自分で比較ロジックを一から書く必要はありません。このテンプレートを利用することで、コードをシンプルかつ読みやすく保つことができます。
構文
template <class ratio1, class ratio2> ratio_equal;
パラメータ
このテンプレートは以下のパラメータを受け取ります。
ratio1, ratio2 − 等しいかどうかを比較したい2つの比率です。
戻り値
2つの比率が等しい場合はtrueを返し、等しくない場合はfalseを返します。
入力例と出力例
入力:
typedef ratio<3, 6> ratio1; typedef ratio<1, 2> ratio2; ratio_equal<ratio1, ratio2>::value;
出力:
true
「3/6」は約分すると「1/2」となるため、結果はtrueになります。
入力:
typedef ratio<3, 9> ratio1; typedef ratio<1, 2> ratio2; ratio_equal<ratio1, ratio2>::value;
出力:
false
「3/9」は「1/3」であり、「1/2」とは等しくないため、結果はfalseになります。
使用例1:等しい比率の場合
#include <iostream>
#include <ratio>
using namespace std;
int main(){
typedef ratio<2, 5> R_1;
typedef ratio<10, 25> R_2;
// 比率が等しいかどうかをチェック
if (ratio_equal<R_1, R_2>::value)
cout<<"Ratio 1 と Ratio 2 は等しい";
else
cout<<"Ratio 1 と Ratio 2 は等しくない";
return 0;
}
出力
上記のコードを実行すると、以下の出力が生成されます。
Ratio 1 と Ratio 2 は等しい
「2/5」と「10/25」はどちらも約分すると「2/5」になるため、等しいと判定されました。
使用例2:等しくない比率の場合
#include <iostream>
#include <ratio>
using namespace std;
int main(){
typedef ratio<2, 5> R_1;
typedef ratio<1, 3> R_2;
// 比率が等しいかどうかをチェック
if (ratio_equal<R_1, R_2>::value)
cout<<"Ratio 1 と Ratio 2 は等しい";
else
cout<<"Ratio 1 と Ratio 2 は等しくない";
return 0;
}
出力
上記のコードを実行すると、以下の出力が生成されます。
Ratio 1 と Ratio 2 は等しくない
「2/5」と「1/3」は値が異なるため、falseが返されています。
使用例3:分母に0を指定した場合
次に、分母に0を指定した場合の動作を確認してみましょう。
#include <iostream>
#include <ratio>
using namespace std;
int main(){
typedef ratio<2, 5> R_1;
typedef ratio<1, 0> R_2;
// 比率が等しいかどうかをチェック
if (ratio_equal<R_1, R_2>::value)
cout<<"Ratio 1 と Ratio 2 は等しい";
else
cout<<"Ratio 1 と Ratio 2 は等しくない";
return 0;
}
出力
上記のコードを実行すると、コンパイル時に以下のようなエラーが発生します。
/usr/include/c++/6/ratio:265:7: error: static assertion failed: denominator cannot be zero static_assert(_Den != 0, "denominator cannot be zero");
このように、ratioテンプレートでは分母に0を指定することは許されておらず、static_assertによってコンパイルエラーとなります。数学的に分母が0の比率は定義できないため、これは妥当な制限といえます。
まとめ
C++のratio_equalテンプレートを使うことで、コンパイル時に2つの比率が等しいかどうかを簡単に判定できます。分数同士の比較ロジックを自前で実装する必要がなく、型安全かつ簡潔に記述できるのが大きなメリットです。なお、分母に0を指定するとコンパイルエラーになる点には注意しましょう。
-
C++でマンハッタン距離と等しい距離を持つパスの数を求める方法
2次元座標系上の2つの点 (x1, y1) と (x2, y2) を表す変数 x1、x2、y1、y2 が与えられます。この記事の目的は、これら2点間のマンハッタン距離と等しい距離を持つすべてのパスの総数を求めることです。 マンハッタン距離とは 2点 (x1, y1) と (x2, y2) の間のマンハッタン距離は、次の式で定義されます。 MD = |x1 − x2| + |y1 − y2| ここで、A = |x1 − x2|、B = |y1 − y2| とおきます。 マンハッタン距離と等しい距離を持つすべてのパスは、合計 (A + B) 本の移動で構成されます。そのうち A 本が水平方向の移動
-
C++で解く「3nスライスのピザ」問題 ― 動的計画法でスライスの合計を最大化する方法
問題の概要 大きさがまちまちの 3n 個のスライスからなるピザがあるとします。私と友人2人は、次のルールに従ってピザを取っていきます。 私が任意のスライスを1枚選びます。 友人のAmalは、私が選んだスライスの反時計回り方向に隣接するスライスを取ります。 友人のBimalは、私が選んだスライスの時計回り方向に隣接するスライスを取ります。 ピザのスライスがなくなるまで、この手順を繰り返します。 各スライスの大きさは、時計回りの順に並べた環状配列 slices として与えられます。求めるのは、私が手にできるスライスの大きさの合計の最大値です。 入出力例 入力が [9, 8, 6, 1, 1,