对std :: for_each实现的限制

时间:2013-02-12 17:53:28

标签: c++ c++11 foreach

在C ++标准(std::for_each)的§25.2.4.2中:

template<class InputIterator, class Function>   Function
for_each(InputIterator first, InputIterator last, Function f);
  

效果:将f应用于取消引用每个迭代器的结果   范围[第一个,最后一个],从第一个开始到最后一个 -   1

  • 这是否意味着f按顺序应用于容器的元素
  • 如果是,parallel mode of libstdc++会违反吗?
  • 如果没有,为什么§6.5.4中基于范围的for循环没有实现为对std :: for_each的调用? (这将允许基于范围的for循环也由实现自动并行化)

2 个答案:

答案 0 :(得分:8)

  • 这是否意味着f按顺序应用于容器的元素

我最初说不,但我认为这确实意味着,是的。其他算法不包括该特定措辞。

  • 如果是这样,libstdc ++的并行模式是否违反了它?

也许,并行模式是一个扩展,有点实验性,并不是真正声称是标准库的100%一致性实现。 (如果它确实声称文档中的某个地方我将修复文档!; - )

  • 如果没有,为什么§6.5.4中基于范围的for循环没有实现为对std :: for_each的调用? (这将允许基于范围的for循环也自动并行化)

基于范围的for不依赖于标准库。如果std::beginstd::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基于为每次迭代调用一个函数。你不能真正“打破”一个功能。