其目的和功能std::for_each与宏BOOST_FOREACH和宏的目的和功能大不相同Q_FOREACH.
std::for_each首先是函数调用.这是一种算法.你调用它,提供一对迭代器.在迭代器范围的每个成员上,它将使用从相关迭代器获取的值调用给定函数.
从std::for_each概念上讲,其目的实际上是与已经存在的更具体的算法相匹配.对于像count,copy等等的算法,有一个简单地为每个元素执行任意代码是有意义的.
BOOST_FOREACH并且Q_FOREACH是等效的结构(我将统称为FOREACH),但表现不同std::for_each.
FOREACH首先是一个for循环.现在,这可能听起来不那么不同,但想一想.你不能打电话continue和break从内std::for_each.continue可以很容易地模拟return(虽然这也意味着你不能从发出std::for_each调用的函数返回).但std::for_each如果你想停下来,就没有办法摆脱循环.同样,你也不能goto摆脱for_each循环.在任何一种情况下你能做的最好就是抛出一个异常,那就是使用流控制的异常(即:不是一个好主意).
使用时std::for_each,必须提供一些可调用的功能.这可以是函数指针或函数对象.因此,您的代码在某种程度上是非本地化的.如果您在每次迭代中所做的事情是复杂的多线函数,那么这很好.但是如果每个迭代的逻辑非常简单,那么代码可读性会略微下降.
FOREACH执行本地代码块.所以代码就在那里; 您不必跟踪函数以查看每次迭代时发生的情况.
此外,调用函数意味着必须编写该函数.如果需要跟踪状态,现在需要一个仿函数,这需要更多的代码来编写.
C++ 11做std::for_each 多与拉姆达功能更具吸引力.这消除了代码局部性问题:源代码就在那里.由于lambdas可以捕获东西,它几乎可以像常规for循环一样工作.好吧,除了没有break功能,但这通常是可以避免的.
当然,C++ 11也使它与基于范围的循环有效地过时(同时FOREACH)for.但是由于与C++ 11存在不同的一致性,因此在某些环境中你有lambda而不是基于范围的for.
你应该用什么取决于你.FOREACH很好,如果你已经在使用Boost和/或Qt,那么请随意.但我不会突然开始使用这些只是为了FOREACH.就个人而言,std::for_each由于代码局部性问题,我不会使用除非你也使用lambdas或其他东西.只需使用一个for循环.
| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |