在C ++标准(std::for_each
)的§25.2.4.2中:
template<class InputIterator, class Function> Function
for_each(InputIterator first, InputIterator last, Function f);
效果:将f应用于取消引用每个迭代器的结果 范围[第一个,最后一个],从第一个开始到最后一个 - 1
答案 0 :(得分:8)
f
按顺序应用于容器的元素?我最初说不,但我认为这确实意味着,是的。其他算法不包括该特定措辞。
也许,并行模式是一个扩展,有点实验性,并不是真正声称是标准库的100%一致性实现。 (如果它确实声称文档中的某个地方我将修复文档!; - )
基于范围的for
不依赖于标准库。如果std::begin
和std::end
可见,则可以使用它们,但不是必需的。此外,它将涉及将循环体打包为lambda,因此您有一个函数对象传递给std::for_each
,这会使基于范围的for
的规范复杂化,这应该具有相同的语义并且与手写for
循环完全一样有效。但真正的原因可能是没有人想过这样做!
答案 1 :(得分:3)
如果没有,为什么§6.5.4中基于范围的for循环没有实现为对std :: for_each的调用? (这将允许基于范围的for循环也自动并行化)
好吧,std::for_each
标准不允许允许“自动并行化”(它必须按顺序进行,如标准中所述),所以就是这样。但更重要的是,基于范围的for
允许除std::for_each
之外的其他内容。作为一种语言功能,您可以在循环中使用 break
。您可以使用goto
或其他语言结构。等等。
std::for_each
基于为每次迭代调用一个函数。你不能真正“打破”一个功能。