boost user - iterator_adaptors

since: 2002-08-29 update: 2002-08-29 count:

はじめに

iterator adaptors は generic なものと、special なものに大別できます。 generic なものは K.INABA.氏の Let's boost boost::iterator_adaptors で解説されているので、そちらをご参照下さい。

あと、special なものは、 見ればわかるものがほとんどなので、解説は少なめでいこうかと思います。

私はこいつらは関数プログラミングの補佐役であると 認識しているのでここに分類されています。

indirect_iterator

サンプルコード

* 演算子で、イテレータが指しているものが 指しているものを返すようにするアダプタです。

std::vector<int> なら普通にできたのに、 std::vector<int*> ならできないよ、って時に使うものです。

reverse_iterator

サンプルコード

++ 演算子で、-- 演算子を呼ぶようにするアダプタです。 rbegin rend を使えば良いと思うのは私だけですか?

transform_iterator

サンプルコード

* 演算子の実行時に、指定した関数で変換してくれるようにするアダプタです。 便利だと思います。 std::map とかのイテレーションには結構重宝します。

projection_iterator

サンプルコード

transform にそっくりですが、変換の際に、 参照を用いるところが違います。 でかい transform は必然的に値コピーが多発するので、 それを避けたい時に使って下さい。

使い方に変なクセがあるので使う時はサンプルコードを凝視して下さい。 参照を返すのに参照じゃないと主張する、 ヘンな関数オブジェクトを作らなければなりません。たぶん。

partial specialization で transform と 合体できるんじゃないかと思うのは私だけですか?

filter_iterator

サンプルコード

条件判定を行うファンクタを渡して、 それによってフィルタリングされたイテレーションを行ってくれる イテレータアダプタです。 ++ 演算の時に条件を満たしてなかったらもう一回 ++ するのでしょう。 かなり使えると思います。

counting_iterator

サンプルコード

ここからはイテレータアダプタではありません。 だからヘッダも分かれています。

++ 演算子を持っているものならなんでも イテレータにしてくれるイテレータです。 vector を 1...N で初期化したいときなどに使えます。

function_output_iterator

サンプルコード

output_iterator です。 output されたものを指定された関数に突っこみます。

typedef function_output_iterator<checked_delete> Trash;

など、いかがでしょう。(動作未確認)

generator_iterator

サンプルコード

* 演算子が呼ばれる度に関数を呼びだしてその値を返すイテレータです。 つーか、イテレートしてないやんけ。

これはかなりの極ものだと思います。 なんせ、番犬(endにあたるもの)が無い。 凄く用途が限られますね。

サンプルもなんかいい感じのを用意しました。 宝くじ中毒の方などは、延々と実行することによって癒えるかもしれません。

permutation_iterator

サンプルコード

二つのイテレータを渡します。 一つ目はランダムアクセスイテレータ、 二つ目は size_t を返すイテレータです。 イテレータは二つ目のイテレータを動かすことによってイテレーションし、 一つ目のイテレータの二つ目の値番目の要素をを返します。 説明するとややこしいですね。 サンプル見て下さい。

二つの基準でコンテナをソートしたいことはありませんか。 私はよくあります。 そういう時に便利ではないかと。

おわり

雑だなあ。


home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h