13

(iterator begin, iterator end)ペアを取る関数に渡したい値のシーケンスがあります。ただし、元のシーケンスの1つおきの要素のみを処理する必要があります。

Standard-Lib / Boostを使用して、元のシーケンスを渡すことができるイテレーターファサードを作成するための優れた方法はありますか?このような単純なものがすでにブーストイテレータまたは範囲ライブラリにあると思いましたが、何も見つかりませんでした。

それとも、これを行うための別の完全に明白な方法がありませんか?もちろん、値を別のシーケンスにコピーするオプションが常にあることはわかっていますが、それは私がやりたいことではありません。

編集:私は知ってfilter_iteratorいますが、それは値をフィルタリングします-それは反復の進行方法を変更しません。

4

3 に答える 3

6

私はあなたがboost::adapters::stridedが欲しいと思います

于 2014-09-23T22:03:41.933 に答える
3
struct TrueOnEven {
 template< typename T >
 bool operator()(const T&) { return mCount++ % 2 == 0; }
 TrueOnEven() : mCount(0) {}
 private:
  int mCount;
};

int main() {
 std::vector< int > tVec, tOtherVec;
 ...
 typedef boost::filter_iterator< TrueOnEven, int > TakeEvenFilterType;

 std::copy( 
  TakeEvenFilterType(tVec.begin(), tVec.end()),
  TakeEvenFilterType(tVec.end(), tVec.end()),
  std::back_inserter(tOtherVec));
}

正直なところ、これは素晴らしく直感的なものではありません。上記のような問題を回避するために、遅延統合クエリを含む単純な「列挙子」ライブラリを作成しました。それはあなたが書くことを可能にします:

Query::From(tVec.begin(), tVec.end())
.Skip<2>()
.ToStlSequence(std::back_inserter(tOtherVec));

ここで、Skip<2>基本的に、N番目ごと(この場合は1秒ごと)の要素をスキップする一般化された「フィルター」をインスタンス化します。

于 2011-04-16T11:19:50.890 に答える
2

これがBoostのフィルターイテレーターです。それはまさにあなたが望むものです。

更新:申し訳ありませんが、間違って読んでください。Boostのすべてのイテレータファンキーネスのリストは次のとおりです。

http://www.boost.org/doc/libs/1_46_1/libs/iterator/doc/#specialized-adaptors

operator++必要なのは、基になるイテレータ値を2回インクリメントするオーバーロードされたプレーンなiterator_adaptorだけだと思います。

于 2011-04-16T11:01:51.070 に答える