Page List

Search on the blog

2010年10月31日日曜日

知ってると便利なSTL(3) max_element, min_element

便利なSTL紹介第3弾!

今日はSTL Containers ではなくSTL algorithmsの紹介。
配列の最大値、最大解(最大値を与える要素)を出力するプログラムを普通に書いてみます。

#define SIZE(buff) (sizeof(buff)/sizeof(buff[0]))
#define REP(i, n) for(int i=0; i<(int)(n); i++)

int main() {
int x[] = {1,3,5,7, 10, 0, 4, 20, 4, 6};

int mx = -1;
REP(i, SIZE(x)) {
if (mx == -1 || x[mx] < x[i])
mx = i;
}
printf("max element=%d, max value=%d\n", mx, x[mx]);

return 0;
}
これが何気に面倒臭かったりします。最大値だけならそうでもない(ループ内でmax使えばいいだけ)ですが、最大値を与えるindexを求める場合は、ちょっとだけソースコードが長くなってしまい面倒です。

そんなときは、STL Algorithmsの出番です。
これでOKです。最大値・最大解と、ついでに最小値・最小解も求めてみましょう。
int main() {
int x[] = {1,3,5,7, 10, 0, 4, 20, 4, 6};

// search max
int *mx = max_element(x, x+SIZE(x));
printf("max element=%d, max value=%d\n", mx - x, *mx);

// search min
int *mn = min_element(x, x+SIZE(x));
printf("min element=%d, min value=%d\n", mn - x, *mn);

return 0;
}
かなりシンプルですね。戻り値はiteratorですが、配列の場合はポインタとの引き算もできるみたいです。これを使えば、上の例のように最小値(最大値)を与えるindexも簡単に出ますね!

0 件のコメント:

コメントを投稿