2016-09-23 7 views
1

まず、私はあなたがこの適切な質問叙述イテレータ

見つからない場合は、私は詳細

の下に、私はほとんど常に十分なシンプルかつに対して十分に特異的ではない何かをしたかった履歴書を偶然見つけ謝罪全く新しい機能を保証しますが、手で毎回反復を行うと、乱雑とエラー - 傾向があるので、私は、forループの伝統の構造を保持するために私を有効に断定イテレータを構築しました:

for (/* loop control */) 
{ 
    /* operation */ 
} 

Specifically, it allows things like: 

for (tree_iterator i (root, SomePredicate); i; ++i) 
{ 
    i->SomeOperation(); 
    i->AnotherOperation(); 
} 

「この反復の仕組みはfaですctoredと一緒に保たれ、ループの本体は、操作に専念しています。私はこれが私のオブジェクト階層を扱う際には便利なツールであることを発見しました。それは非常に複雑な反復が抽象化し、すべての適切な部分を明確に表現するために、誰かが叙述イテレータは、それが実装される可能性がどのようにあるか、いずれかのディテールものにいくつかの光を投げることができる

「。ことができますし、それがどのように働く?

お時間を

おかげで、謝罪はこれは。項目の反復子をラップイテレータ

+0

は、いつのstd :: 'のようなものがfor_each'、過度に賢いになりたいと思い、誰かのように思えると' BOOST_FOREACH'は 'C++で利用できた98'特にループに基づく範囲ではあまり有用ではありません。 – Chad

+3

誰かが自家製バージョンの 'for(auto && item:container | boost :: adapters :: filtered(predicate)){...}'のように見えます – Praetorian

答えて

2

filter_iterator間違って質問されており、あなたはしたくないものをスキップした場合。

std::vector<ShoppingItem> list = ... 
auto veggies = make_filter_iterator(isVegitable, list.begin(), list.end()); 

while(veggies != veggies.end()) { 
    buy(*veggies); 
} 

Kあなたがfilter_iteratorを進めると、それは内部イテレータを進め、次のアイテムが保持されるべきかどうかをチェックすることです。そうでない場合は、内部イテレータが最後まで到達し続けるか、または保持されるアイテムが見つかるまで続けます。

filtered rangesはほとんど常に優れているため、実際にはほとんど使用されません。

1
for (tree_iterator i (root, SomePredicate); i; ++i) 
{ 
    i->SomeOperation(); 
    i->AnotherOperation(); 
} 

はと考えることができます。

for (regular_iterator i(root); i; ++i) 
{ 
    if (SomePredicate(*i)) 
    { 
     i->SomeOperation(); 
     i->AnotherOperation(); 
    } 
} 
関連する問題