CodeNebula
C++20stladvanced

std::views::reverse / std::ranges::reverse_view (C++20 Addition)

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

Explanation

Creates a view that iterates over a bidirectional range in reverse order. No data is moved or copied -- the view simply reverses the traversal direction.

Real-World Scenario

Display recent log entries in reverse chronological order for a monitoring dashboard.

Quick Snippet

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

std::vector<int> data = {1, 2, 3, 4, 5};
for (int x : data | std::views::reverse) {
    // Yields: 5, 4, 3, 2, 1
}

Full Example

ranges_reverse_view.cpp
// CodeNebula - C++20 Example: std::ranges::reverse_view
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_reverse_view.cpp

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

int main() {
    // Basic reverse view over a vector
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8};

    std::cout << "Original: ";
    for (int n : numbers) std::cout << n << " ";
    std::cout << "\n";

    std::cout << "Reversed: ";
    for (int n : std::ranges::reverse_view(numbers)) std::cout << n << " ";
    std::cout << "\n";

    // Using views::reverse adaptor
    std::cout << "Via adaptor: ";
    for (int n : numbers | std::views::reverse) std::cout << n << " ";
    std::cout << "\n";

    // Reverse view over strings
    std::vector<std::string> words = {"alpha", "beta", "gamma", "delta"};
    std::cout << "\nWords reversed: ";
    for (const auto& w : words | std::views::reverse) std::cout << w << " ";
    std::cout << "\n";

    // Double reverse returns to original order
    std::cout << "Double reversed: ";
    for (int n : numbers | std::views::reverse | std::views::reverse)
        std::cout << n << " ";
    std::cout << "\n";

    // Combining reverse with other views
    std::cout << "\nLast 3 elements (reversed take): ";
    for (int n : numbers | std::views::reverse | std::views::take(3))
        std::cout << n << " ";
    std::cout << "\n";

    // Reverse view preserves bidirectional access
    auto rev = std::ranges::reverse_view(numbers);
    std::cout << "First in reverse: " << *rev.begin() << "\n";
    std::cout << "Size of reverse view: " << std::ranges::size(rev) << "\n";

    // Reverse view over a subrange
    std::cout << "Middle reversed: ";
    for (int n : std::ranges::subrange(numbers.begin() + 2, numbers.begin() + 6)
                 | std::views::reverse)
        std::cout << n << " ";
    std::cout << "\n";

    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_reverse_view.cpp