CodeNebula
C++20stladvanced

std::views::transform (pipe syntax) (C++20 Addition)

C++20 · The Big Four · Compiler flag: -std=c++20

Explanation

Range adaptor that creates a `transform_view` via pipe syntax. Captures a projection function and lazily applies it to each element during iteration.

Real-World Scenario

Create a reusable "to uppercase" transformation for string processing pipelines.

Quick Snippet

snippet.cpp
#include <ranges>
#include <vector>

auto doubled = std::views::transform([](int n) { return n * 2; });
std::vector<int> data = {1, 2, 3};
for (int x : data | doubled) { /* 2, 4, 6 */ }

Full Example

ranges_adaptor_transform.cpp
// CodeNebula - C++20 Example: views::transform
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_adaptor_transform.cpp

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

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

    // Basic transform: square each element
    std::cout << "Squares: ";
    for (int n : numbers | std::views::transform([](int x) { return x * x; }))
        std::cout << n << " ";
    std::cout << "\n";

    // Transform to different type
    std::cout << "As doubles (halved): ";
    for (double d : numbers | std::views::transform([](int x) { return x / 2.0; }))
        std::cout << d << " ";
    std::cout << "\n";

    // Transform strings
    std::vector<std::string> words = {"hello", "world", "cpp", "twenty"};
    std::cout << "\nUppercased: ";
    for (const auto& s : words | std::views::transform([](std::string s) {
             for (char& c : s) c = static_cast<char>(std::toupper(c));
             return s;
         }))
        std::cout << s << " ";
    std::cout << "\n";

    // Transform to extract string lengths
    std::cout << "Lengths: ";
    for (auto len : words | std::views::transform(&std::string::size))
        std::cout << len << " ";
    std::cout << "\n";

    // Chain transform with filter
    std::cout << "\nEven squares: ";
    for (int n : numbers | std::views::transform([](int x) { return x * x; })
                         | std::views::filter([](int x) { return x % 2 == 0; }))
        std::cout << n << " ";
    std::cout << "\n";

    // Mathematical transforms
    std::vector<double> angles = {0.0, 0.5, 1.0, 1.5, 2.0};
    std::cout << "sin(x): ";
    for (double s : angles | std::views::transform([](double x) { return std::sin(x); }))
        std::cout << s << " ";
    std::cout << "\n";

    // Transform with index simulation using iota
    std::cout << "\nIndexed words:\n";
    for (auto idx : std::views::iota(0, static_cast<int>(words.size()))
                    | std::views::transform([&](int i) {
                          return std::to_string(i) + ": " + words[i];
                      }))
        std::cout << "  " << idx << "\n";

    // Multiple transforms chained
    std::cout << "Cubed mod 10: ";
    for (int n : numbers | std::views::transform([](int x) { return x * x * x; })
                         | std::views::transform([](int x) { return x % 10; }))
        std::cout << n << " ";
    std::cout << "\n";
    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_adaptor_transform.cpp