2016-09-23 90 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一起出現並保持在一起,循環的主體專門用於操作。在處理我的對象層次結構時,我發現這是一個有用的工具。它允許清楚地與所有的適當部位抽取表示非常複雜的迭代。」

有人可以扔在一個斷言迭代就是一些輕或如何可以實現的任何細節,它是如何工作的?

感謝您的時間,道歉,如果這是一個錯誤的問題。

+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(); 
    } 
}