2009年2月6日金曜日

STLの accumulate と find_if

vector vecの和は

double sum = accumulate( vec.begin(), vec.end(), 0.0, plus< double >() );


こんな感じ。結構面倒くさい。 plus<> 等は functional にある。

vecが昇順に整列済みなら、
*find_if( vec.begin(), vec.end(), bind2nd( greater< double >(), x) );

でxより大きい最初の値を得ることが出来る。

plus
minus
multiplies
divides
modulus
negate
equal_to
not_equal_to
less
less_equal
greater
greater_equal
logical_and
logical_or
logical_not
等など。

templateクラスのfriend宣言

templateクラスのfriend宣言は

1.最初にtemplateクラスの前に宣言する。
2.templateクラスでfriend宣言する。
3.クラスの外で内容を書く。

friend関数がtemplate関数の場合

friend int& operator += <> (int& x, int&y);


のように名前の後にブラケットをつけてtemplate関数であることを示す必要が有る。