对 std::for_each 实施的限制

Restrictions on std::for_each implementation

本文关键字:each std for      更新时间:2023-10-16

在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 按顺序应用于容器的元素?
  • 如果是这样,libstdc++ 的并行模式是否违反了它?
  • 如果不是,为什么 §6.5.4 中基于范围的 for 循环没有实现为对 std::for_each 的调用?(这将允许基于范围的 for 循环也由实现自动并行化(
  • 这是否意味着f顺序应用于容器的元素?

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

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

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

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

基于范围的for不依赖于标准库才能工作。如果std::beginstd::end可见,则可以使用它们,但不是必需的。 此外,它将涉及将循环体打包为lambda,因此您有一个函数对象传递给std::for_each,这将使基于范围的for规范复杂化,后者应该具有相同的语义并且与手写for循环一样高效。 但真正的原因可能是没有人想过这样做!

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

好吧,标准不允许std::for_each">自动并行化"(它必须按顺序进行,如标准中所述(,所以就是这样。但更重要的是,基于范围的for允许除std::for_each之外的其他事情。例如,作为语言功能,您可以 break出圈。您可以使用goto或其他语言结构。等等。

std::for_each基于为每次迭代调用一个函数。而且你不能真正"脱离"一个功能。