アルゴリズムのそれってこーいうことか(その1)
最近少し暇になったので、仕事時間とは別に時間を作って色々勉強するようにしています。
せっかくなので、自分が勉強して詰まったところとか、他の人が詰まりそうなところとかを日記に残す事にします。
説明文を書いていく過程で自分の知識もまとまりますしね。
関数オブジェクトのCHogeHoge()って何?
さて、最近STLのアルゴリズムの勉強をしています。for_each()とかtransform()とかのアレです。
今回はまず、簡単なアルゴリズムの使い方についておさらいしておきます。
intのコンテナについて、各値を1つずつ増加したい場合に、これをfor_eachを使って実装してみると次のようになります。
//! intの参照を受け取って返り値がvoid型の関数オブジェクト struct SIncrementer1 { void operator()( int& rValue ) { ++rValue; return; } }; ... listvalues(3); // 0で初期化されているはず for_each( values.begin(), values.end(), SIncremeter1() ); // ...(*A) // ここで全ての値が1になっている ...
ちなみにSIncrementer1は清く正しくunary_functionを使って書く事ももちろん可能です。unary_functionを使うと、上のSIncrementer1は下のように書き換える事ができます。*1
struct SIncrementer1 : public unary_function< int&, void > { result_type operator()( argument_type rValue ) { ++rValue; return; } };
ここまでがアルゴリズムの簡単な使い方のおさらいです。
さて、ここで一つ問題です。(*A)でfor_eachの第3引数に渡している SIncrementer1() ってどういう意味でしょうか?
関数オブジェクトってこういう使い方をするもんだ、となんとなく使っちゃってませんか?ていうか、恥ずかしながら自分はなんとなく使っちゃってました。
(続く)
*1: