内容提要
C++23引入了std::ranges::fold_*算法族,包括六个fold函数,可满足不同的使用情况。其中,fold_left函数可用于替代std::accumulate,同时还提供了fold_right函数。fold_left_first和fold_right_last函数使用范围的第一个元素作为初始元素,而fold_left_with_iter和fold_left_first_with_iter函数则公开了由fold计算的另一个结果:结束迭代器。然而,由于会产生额外的复制,因此不支持fold_*算法族的投影函数。std::ranges::reduce函数已计划但尚未编写。
关键要点
-
C++23引入了std::ranges::fold_*算法族,包括六个fold函数,满足不同使用情况。
-
fold_left函数可替代std::accumulate,fold_right函数用于右折叠操作。
-
fold_left_first和fold_right_last函数使用范围的第一个元素作为初始元素。
-
fold_left_with_iter和fold_left_first_with_iter函数返回由fold计算的结束迭代器。
-
fold_*算法族不支持投影函数,因为会产生额外的复制。
-
std::ranges::reduce函数已计划但尚未编写。
-
C++20的算法允许使用范围而非迭代器对,支持投影函数和概念约束。
-
std::accumulate和std::reduce都是折叠操作,前者是左折叠,后者支持并行执行。
-
fold_left和fold_right的行为在某些操作上可能不同,尤其是非结合性操作。
-
C++23的设计不默认初始元素,要求开发者明确指定。
-
如果没有身份元素,可以使用fold_left_first和fold_right_last函数。
-
fold_left_with_iter函数避免了重复计算结束迭代器。
-
fold函数扩展并替代std::accumulate,但std::reduce的实现尚未完成。