Build With Abdallah logo Build With Abdallah Software · AI · Automation
Tutorial 2 min read Jun 06, 2026

Leveraging C++26's Ranges Library with Visual Studio 2026

The C++26 Ranges library introduces powerful, expressive tools for working with sequences of data. By providing a more functional approach to data manipulation, Ranges allow you to

A
Abdallah Mohamed
Senior Full-Stack Engineer
Leveraging C++26's Ranges Library with Visual Studio 2026

Leveraging C++26's Ranges Library with Visual Studio 2026

The C++26 Ranges library introduces powerful, expressive tools for working with sequences of data. By providing a more functional approach to data manipulation, Ranges allow you to write cleaner and more intuitive code. This tutorial will guide you through setting up a C++26 project using the Ranges library in Visual Studio 2026, providing a hands-on approach to understanding and utilizing this feature.

Prerequisites

Before you start, ensure you have the following installed on your system:

  1. Visual Studio 2026: The latest version is required to support C++26 features.
  2. C++26 Compiler: Comes with Visual Studio 2026. Ensure it is selected during installation.

To install Visual Studio 2026, follow these steps:

  1. Download Visual Studio 2026 from the official website.
  2. Run the installer and select the "Desktop development with C++" workload.
  3. Ensure that the C++26 standard is enabled in your project settings.

Project Structure

Create a directory for your project. The structure will look like this:

Cpp26RangesTutorial/
├── build/
├── include/
└── src/
    └── main.cpp
  • build/: Directory where build files will be generated.
  • include/: Directory for header files.
  • src/: Directory for source files, where main.cpp is located.

Step 1: Setting Up Your Project

First, create the project directory and the initial files:

mkdir -p Cpp26RangesTutorial/src
touch Cpp26RangesTutorial/src/main.cpp

Now, open Visual Studio 2026 and create a new project:

  1. Select "Create a new project".
  2. Choose "Console App" and click "Next".
  3. Set the project name to Cpp26RangesTutorial and the location to your created directory.
  4. Click "Create".

Configure the project to use the C++26 standard:

  1. Right-click on the project in Solution Explorer and select "Properties".
  2. Under "C/C++", select "Language".
  3. Set "C++ Language Standard" to "ISO C++26 Standard (/std:c++26)".

Step 2: Basic Range Usage

Let's start by using a simple example of the Ranges library to filter and transform a list of numbers.

Edit main.cpp to include the following code:

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });

    std::cout << "Even numbers: ";
    for (int n : even_numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

Explanation

  • std::views::filter: Filters the elements of the range based on a predicate. Here, it selects even numbers.
  • Pipelines (|): Used to apply multiple range operations in a clean and concise manner.

To build and run the project, press Ctrl + F5 in Visual Studio 2026. You should see the output:

Even numbers: 2 4 6 8 10

Step 3: Transforming Data with Ranges

Next, we'll use the Ranges library to transform data. Modify main.cpp to include a transformation step:

#include <iostream>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    auto transformed_numbers = numbers 
        | std::views::filter([](int n) { return n % 2 == 0; })
        | std::views::transform([](int n) { return n * n; });

    std::cout << "Squared even numbers: ";
    for (int n : transformed_numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

Explanation

  • std::views::transform: Applies a transformation to each element of the range. In this case, it squares the number.
  • Chaining: Demonstrates how you can chain multiple operations using the pipeline syntax.

Build and run the project again. The expected output is:

Squared even numbers: 4 16 36 64 100

In these steps, you've learned how to set up a C++26 project in Visual Studio 2026 and utilize the basic functionalities of the Ranges library to filter and transform data. This foundational understanding will allow you to explore more advanced features of Ranges in subsequent sections.

Step 4: Combining Ranges with Custom Views

The Ranges library allows you to create custom views, adding further flexibility. Let's create a custom view that generates a sequence of numbers.

Edit main.cpp to include a custom view:

#include <iostream>
#include <ranges>
#include <vector>

// Custom view to generate a sequence of numbers
auto generate_sequence(int start, int end) {
    return std::views::iota(start, end);
}

int main() {
    auto sequence = generate_sequence(1, 11) 
        | std::views::filter([](int n) { return n % 2 == 0; })
        | std::views::transform([](int n) { return n * n; });

    std::cout << "Squared even numbers from 1 to 10: ";
    for (int n : sequence) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

Explanation

  • Custom View (generate_sequence): Uses std::views::iota to generate a range of numbers from start to end.
  • Integration: Combines custom views with existing Ranges operations for more complex data manipulation.

Build and run the project. The output should be:

Squared even numbers from 1 to 10: 4 16 36 64 100

Step 5: Handling Strings with Ranges

Ranges can also be applied to strings. Let's create an example that processes a string to extract uppercase characters.

Modify main.cpp:

#include <iostream>
#include <ranges>
#include <string>

int main() {
    std::string text = "Hello, C++26 Ranges!";

    auto uppercase_letters = text 
        | std::views::filter([](char c) { return std::isupper(c); });

    std::cout << "Uppercase letters: ";
    for (char c : uppercase_letters) {
        std::cout << c << " ";
    }
    std::cout << std::endl;

    return 0;
}

Explanation

  • String Ranges: Demonstrates filtering operations on strings to extract specific character types.
  • std::isupper: A standard library function used to check if a character is uppercase.

Run the project to see:

Uppercase letters: H C R

Complete Working Example

Here is the complete main.cpp file with all examples combined:

#include <iostream>
#include <ranges>
#include <vector>
#include <string>

// Custom view to generate a sequence of numbers
auto generate_sequence(int start, int end) {
    return std::views::iota(start, end);
}

int main() {
    // Example with numbers
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    auto transformed_numbers = numbers 
        | std::views::filter([](int n) { return n % 2 == 0; })
        | std::views::transform([](int n) { return n * n; });

    std::cout << "Squared even numbers: ";
    for (int n : transformed_numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // Custom sequence generation
    auto sequence = generate_sequence(1, 11) 
        | std::views::filter([](int n) { return n % 2 == 0; })
        | std::views::transform([](int n) { return n * n; });

    std::cout << "Squared even numbers from 1 to 10: ";
    for (int n : sequence) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // Example with strings
    std::string text = "Hello, C++26 Ranges!";

    auto uppercase_letters = text 
        | std::views::filter([](char c) { return std::isupper(c); });

    std::cout << "Uppercase letters: ";
    for (char c : uppercase_letters) {
        std::cout << c << " ";
    }
    std::cout << std::endl;

    return 0;
}

Common Errors and Fixes

  1. Error: std::views::iota not found

    Fix: Ensure you are using the C++26 standard. Check project properties and confirm /std:c++26 is set.

  2. Error: std::isupper requires #include <cctype>

    Fix: Add #include <cctype> at the top of your file to use character classification functions.

  3. Error: std::views::filter requires a predicate

    Fix: Ensure your lambda function in std::views::filter returns a boolean value.

Conclusion

This tutorial covered setting up a C++26 project in Visual Studio 2026 and using the Ranges library for data manipulation. You learned to filter, transform, and create custom views, as well as handle strings with Ranges. These examples form a solid base for exploring more advanced applications of Ranges.

Sources