CodeNebula
C++20stladvanced

std::ranges::swap_ranges / reverse / reverse_copy (C++20 Addition)

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

Explanation

`swap_ranges` swaps elements between two ranges pairwise. `reverse` reverses elements in place. `reverse_copy` copies elements in reverse order to an output.

Real-World Scenario

Reverse the order of undo history entries when converting to a redo stack.

Quick Snippet

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

std::vector<int> data = {1, 2, 3, 4, 5};
std::ranges::reverse(data);
// data == {5, 4, 3, 2, 1}

std::vector<int> reversed(5);
std::ranges::reverse_copy(data, reversed.begin());

Full Example

ranges_reverse_algo.cpp
// CodeNebula - C++20 Example: Ranges Reverse
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_reverse_algo.cpp

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

int main() {
    // ranges::reverse - reverse elements in place
    std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7};
    std::cout << "Original: ";
    for (int n : nums) std::cout << n << ' ';
    std::cout << '\n';

    std::ranges::reverse(nums);
    std::cout << "Reversed: ";
    for (int n : nums) std::cout << n << ' ';
    std::cout << '\n';

    // Reverse a subrange using iterators
    std::vector<int> data = {10, 20, 30, 40, 50, 60};
    std::ranges::reverse(data.begin() + 1, data.begin() + 5);
    std::cout << "\nPartial reverse [1,5): ";
    for (int d : data) std::cout << d << ' ';
    std::cout << '\n';

    // ranges::reverse_copy - copy in reverse order
    std::vector<int> src = {1, 2, 3, 4, 5};
    std::vector<int> dst(src.size());

    std::ranges::reverse_copy(src, dst.begin());
    std::cout << "\nSource:        ";
    for (int s : src) std::cout << s << ' ';
    std::cout << '\n';
    std::cout << "Reverse copy:  ";
    for (int d : dst) std::cout << d << ' ';
    std::cout << '\n';

    // Reverse a string
    std::string word = "CodeNebula";
    std::cout << "\nOriginal string: " << word << '\n';
    std::ranges::reverse(word);
    std::cout << "Reversed string: " << word << '\n';

    // reverse_copy into a new string
    std::string greeting = "Hello";
    std::string reversed(greeting.size(), ' ');
    std::ranges::reverse_copy(greeting, reversed.begin());
    std::cout << "\n\"" << greeting << "\" reversed: \"" << reversed << "\"\n";

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