最大値を求める

アバター
a5ua
記事: 199
登録日時: 14年前

最大値を求める

投稿記事 by a5ua » 14年前

ふと思いついたので、書いてみる。

最大値を求めるとき、どのようなコードを書くでしょうか?

コンテナの中の最大値なら、(C++であれば)std::max_elementが使えます。
そうでない場合は、適当な初期値を設定して、ループ中で最大値を更新するという処理になると思います。

CODE:

result = -999;
for (略) {
	result = std::max(result, temp_result);
}
今回は、後者の場合に、それまで代入された値の中で最大のものを保持するという機能を
演算子オーバーロードを使って、実現してみました。(maximizerクラステンプレート)

CODE:

#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;
};
メリットとしては、明示的な最小値を初期値として指定する必要がありません。
ただし、値が一度も代入されていない場合、最大値を取得しようとすると、エラーになります。

以下、サンプルコード

CODE:

#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
最後に編集したユーザー a5ua on 2011年5月29日(日) 22:01 [ 編集 1 回目 ]

コメントはまだありません。