C++23 新的折叠算法

C++23 新的折叠算法

💡 原文英文,约2100词,阅读约需8分钟。
📝

内容提要

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的实现尚未完成。

➡️

继续阅读