最大値を求めるとき、どのようなコードを書くでしょうか?
コンテナの中の最大値なら、(C++であれば)std::max_elementが使えます。
そうでない場合は、適当な初期値を設定して、ループ中で最大値を更新するという処理になると思います。 今回は、後者の場合に、それまで代入された値の中で最大のものを保持するという機能を
演算子オーバーロードを使って、実現してみました。(maximizerクラステンプレート)
#pragma once
#include
#include
template
>
class maximizer
{
public:
typedef T value_type;
typedef Pred comparator;
// コンストラクタ:値無し
maximizer() :
m_emptiness(true),
m_comparator(comparator())
{
}
// コンストラクタ:初期値指定
maximizer(const value_type &val) :
m_emptiness(false),
m_value(val),
m_comparator(comparator())
{
}
// 最大値の更新
// 値がセットされていない場合はそのまま代入
// 値がセットされている場合は指定されたファンクタを用いて更新
const maximizer &operator=(const value_type &val)
{
if (empty()) {
m_emptiness = false;
m_value = val;
} else if (m_comparator(m_value, val)) {
m_value = val;
}
return *this;
}
// 値がセットされていない場合、trueを返す
bool empty() const
{
return m_emptiness;
}
// 最大値を返す
// 値がセットされていない場合、アサーションに失敗する
const value_type &value() const
{
assert(!empty() && "the value is invalid.");
return m_value;
}
private:
maximizer(const maximizer &);
maximizer &operator=(const maximizer &);
bool m_emptiness;
value_type m_value;
comparator m_comparator;
};
ただし、値が一度も代入されていない場合、最大値を取得しようとすると、エラーになります。
以下、サンプルコード
#include
#include "maximizer.hpp"
void sample1()
{
maximizer m;
// 値がセットされているかどうかチェック
if (m.empty()) {
std::cout m("mixC++");
std::cout > m;
m = 100;
std::cout << m.value() << std::endl;
m = 0.001;
std::cout << m.value() << std::endl;
m = 0.5;
std::cout << m.value() << std::endl;
}
int main()
{
sample1();
sample2();
sample3();
}
empty!
100
100
200
mixC++
mixC++
programming
100
0.001
0.001