10

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

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

效果:将 f 应用于取消引用范围 [first,last) 中的每个迭代器的结果, 从 first 开始,一直到 last - 1

  • 这是否意味着 f按顺序应用于容器的元素?
  • 如果是这样,libstdc++的并行模式是否违反了它?
  • 如果不是,为什么第 6.5.4 节中基于范围的 for 循环没有实现为对 std::for_each 的调用?(这将允许基于范围的 for 循环也被实现自动并行化)
4

2 回答 2

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

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

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

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

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

基于范围的for工作不依赖于标准库。如果std::beginstd::end可见,它们可能会被使用,但不是必需的。std::for_each此外,它将涉及将循环体打包为 lambda,因此您有一个函数对象要传递for给写for循环。但真正的原因可能是没有人想过那样做!

于 2013-02-12T17:58:43.510 回答
3

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

好吧,标准std::for_each不允许“自动并行化”(它必须按顺序进行,如标准中所述),所以就是这样。但更重要的是,基于范围for允许除std::for_each. 例如,作为一种语言功能,您可以break脱离循环。您可以使用goto或其他语言结构。等等。

std::for_each是基于为每次迭代调用一个函数。而且你不能真正“打破”一个功能。

于 2013-02-12T18:39:31.620 回答