C++23 Fold Algorithms

Advantages of Fold Algorithms

What are the advantages of using fold_left() over accumulate()?

Abstract art representing computer programming

Using std::ranges::fold_left() over std::accumulate() has several advantages, mainly related to flexibility, control, and modern C++ features.

1. Range-Based

fold_left() is part of the C++20 ranges library, which provides a more modern and flexible approach to handling collections.

It works seamlessly with range-based algorithms and can be combined with other range views and actions, allowing for more expressive and readable code.

2. Direction of Folding

accumulate() only supports left-to-right folding.

fold_left() explicitly supports left-to-right folding, and C++23 introduces fold_right() for right-to-left folding, providing more control over the order of operations.

3. Initial Value Variants

While accumulate() requires an initial value, fold_left_first() and fold_right_last() variants use the first or last element of the range as the initial value, reducing boilerplate code and potential errors.

4. Handling Empty Ranges

fold_left_first() and fold_right_last() return a std::optional, making it easy to handle empty ranges gracefully without additional checks.

5. Iterator and Sentinel Support

fold_left_with_iter() and fold_left_first_with_iter() return the final iterator position alongside the result.

This provides additional information about the processing, which can be useful for further operations.

6. Custom Operators

Both accumulate() and fold_left() support custom binary operations, but the latter integrates better with range-based customization and lambdas.

Example Comparison

Here’s an example comparing std::accumulate() with std::ranges::fold_left():

#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
  std::vector<int> numbers{1, 2, 3, 4, 5};

  // Using std::accumulate()
  int accumulate_result = std::accumulate(
    numbers.begin(), numbers.end(), 0);
  std::cout << "Accumulate result: "
    << accumulate_result << "\n";

  // Using std::ranges::fold_left()
  int fold_left_result = std::ranges::fold_left(
    numbers, 0, std::plus<>());
  std::cout << "Fold left result: "
    << fold_left_result;
}
Accumulate result: 15
Fold left result: 15

Using a Custom Lambda

In this example, we use a custom lambda as our folding operation:

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
  std::vector<int> numbers{1, -2, 3, -4, 5};

  auto abs_sum = [](int x, int y) {
    return std::abs(x) + std::abs(y); };

  int result = std::ranges::fold_left(
    numbers, 0, abs_sum);
  std::cout << "Result: " << result;
}
Result: 15

In summary, std::ranges::fold_left() offers more flexibility, control, and modern features compared to std::accumulate(), making it a preferred choice for many scenarios in modern C++ programming.

This Question is from the Lesson:

C++23 Fold Algorithms

An introduction to the 6 new folding algorithms added in C++23, providing alternatives to std::reduce and std::accumulate

Answers to questions are automatically generated and may not have been reviewed.

This Question is from the Lesson:

C++23 Fold Algorithms

An introduction to the 6 new folding algorithms added in C++23, providing alternatives to std::reduce and std::accumulate

A computer programmer
Part of the course:

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Free, unlimited access

This course includes:

  • 125 Lessons
  • 550+ Code Samples
  • 96% Positive Reviews
  • Regularly Updated
  • Help and FAQ
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved