iterator adaptors は generic なものと、special なものに大別できます。 generic なものは K.INABA.氏の Let's boost の boost::iterator_adaptors で解説されているので、そちらをご参照下さい。
あと、special なものは、 見ればわかるものがほとんどなので、解説は少なめでいこうかと思います。
私はこいつらは関数プログラミングの補佐役であると 認識しているのでここに分類されています。
* 演算子で、イテレータが指しているものが 指しているものを返すようにするアダプタです。
std::vector<int> なら普通にできたのに、 std::vector<int*> ならできないよ、って時に使うものです。
++ 演算子で、-- 演算子を呼ぶようにするアダプタです。 rbegin rend を使えば良いと思うのは私だけですか?
* 演算子の実行時に、指定した関数で変換してくれるようにするアダプタです。 便利だと思います。 std::map とかのイテレーションには結構重宝します。
transform にそっくりですが、変換の際に、 参照を用いるところが違います。 でかい transform は必然的に値コピーが多発するので、 それを避けたい時に使って下さい。
使い方に変なクセがあるので使う時はサンプルコードを凝視して下さい。 参照を返すのに参照じゃないと主張する、 ヘンな関数オブジェクトを作らなければなりません。たぶん。
partial specialization で transform と 合体できるんじゃないかと思うのは私だけですか?
条件判定を行うファンクタを渡して、 それによってフィルタリングされたイテレーションを行ってくれる イテレータアダプタです。 ++ 演算の時に条件を満たしてなかったらもう一回 ++ するのでしょう。 かなり使えると思います。
ここからはイテレータアダプタではありません。 だからヘッダも分かれています。
++ 演算子を持っているものならなんでも イテレータにしてくれるイテレータです。 vector を 1...N で初期化したいときなどに使えます。
output_iterator です。 output されたものを指定された関数に突っこみます。
typedef function_output_iterator<checked_delete> Trash;
など、いかがでしょう。(動作未確認)
* 演算子が呼ばれる度に関数を呼びだしてその値を返すイテレータです。 つーか、イテレートしてないやんけ。
これはかなりの極ものだと思います。 なんせ、番犬(endにあたるもの)が無い。 凄く用途が限られますね。
サンプルもなんかいい感じのを用意しました。 宝くじ中毒の方などは、延々と実行することによって癒えるかもしれません。
二つのイテレータを渡します。 一つ目はランダムアクセスイテレータ、 二つ目は size_t を返すイテレータです。 イテレータは二つ目のイテレータを動かすことによってイテレーションし、 一つ目のイテレータの二つ目の値番目の要素をを返します。 説明するとややこしいですね。 サンプル見て下さい。
二つの基準でコンテナをソートしたいことはありませんか。 私はよくあります。 そういう時に便利ではないかと。
雑だなあ。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。