2016-09-23 93 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(); 
    } 
}