Page List

Search on the blog

2010年10月31日日曜日

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

便利なSTL紹介第3弾!

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

  1. #define SIZE(buff) (sizeof(buff)/sizeof(buff[0]))  
  2. #define REP(i, n) for(int i=0; i<(int)(n); i++)  
  3.   
  4. int main() {  
  5.   int x[] = {1,3,5,7, 10, 0, 4, 20, 4, 6};  
  6.   
  7.   int mx = -1;  
  8.   REP(i, SIZE(x)) {  
  9.       if (mx == -1 || x[mx] < x[i])  
  10.           mx = i;  
  11.   }  
  12.   printf("max element=%d, max value=%d\n", mx, x[mx]);  
  13.   
  14.   return 0;  
  15. }  
これが何気に面倒臭かったりします。最大値だけならそうでもない(ループ内でmax使えばいいだけ)ですが、最大値を与えるindexを求める場合は、ちょっとだけソースコードが長くなってしまい面倒です。

そんなときは、STL Algorithmsの出番です。
これでOKです。最大値・最大解と、ついでに最小値・最小解も求めてみましょう。
  1. int main() {  
  2.    int x[] = {1,3,5,7, 10, 0, 4, 20, 4, 6};  
  3.   
  4.    // search max  
  5.    int *mx = max_element(x, x+SIZE(x));  
  6.    printf("max element=%d, max value=%d\n", mx - x, *mx);  
  7.   
  8.    // search min  
  9.    int *mn = min_element(x, x+SIZE(x));  
  10.    printf("min element=%d, min value=%d\n", mn - x, *mn);  
  11.   
  12.    return 0;  
  13. }  
かなりシンプルですね。戻り値はiteratorですが、配列の場合はポインタとの引き算もできるみたいです。これを使えば、上の例のように最小値(最大値)を与えるindexも簡単に出ますね!

0 件のコメント:

コメントを投稿