对 std::for_each 实施的限制
Restrictions on std::for_each implementation
在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::begin
和std::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
基于为每次迭代调用一个函数。而且你不能真正"脱离"一个功能。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 将函数应用于std::map值,其中包含for each和lambda函数
- g++ 4.4.7 -std=gnu++0x 应该编译"for each"结构吗?
- for-each 循环生成错误,但 for(it=begin()...在遍历 std::map 包含 unique_ptr 时不会
- 'for each'不是 std 的成员。 已启用 C++11 支持