How to Reverse a Vector in C++

by | C++, Programming

Reversing a vector is a common task in C++ programming. This guide covers different methods to reverse a vector, helping you write efficient and maintainable code.

Using std::reverse

The simplest and most efficient way to reverse a vector is using the STL’s std::reverse algorithm. Let’s see how to implement this approach.

Basic Vector Reversal using std::reverse
#include <iostream>   // For input/output operations
#include <vector>     // For std::vector
#include <algorithm>  // For std::reverse

int main() {
    // Create a vector with some elements
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // Print original vector
    std::cout << "Original vector: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    // Reverse the vector using std::reverse
    std::reverse(numbers.begin(), numbers.end());

    // Print reversed vector
    std::cout << "Reversed vector: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    return 0;
}
Output:
Original vector: 1 2 3 4 5
Reversed vector: 5 4 3 2 1

What the Code Does

  • Includes necessary headers:
    • <iostream>: For input/output operations.
    • <vector>: To work with std::vector.
    • <algorithm>: To use the std::reverse algorithm.
  • Creates a vector numbers initialized with elements {1, 2, 3, 4, 5}.
  • Prints the original vector elements to the console.
  • Uses std::reverse(numbers.begin(), numbers.end()) to reverse the vector in place:
    • numbers.begin(): Points to the start of the vector.
    • numbers.end(): Points just past the end of the vector.
    • The algorithm swaps elements symmetrically until the center is reached.
  • Prints the reversed vector to confirm the changes.

Key Points

  • std::reverse is the most efficient way to reverse a vector
  • It works in-place, meaning no extra memory is needed
  • Time complexity is O(n/2) where n is the vector size

Using std::ranges::reverse (C++20)

C++20 introduces the ranges library, which provides a more modern and flexible way to work with sequences. The ranges::reverse algorithm offers a cleaner syntax and additional safety features compared to the traditional std::reverse.

Vector Reversal using std::ranges::reverse
#include <iostream>   // For input/output operations
#include <vector>     // For std::vector
#include <ranges>     // For std::ranges::reverse

int main() {
    // Create a vector with some elements
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // Print original vector
    std::cout << "Original vector: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    // Reverse using ranges::reverse
    std::ranges::reverse(numbers);

    // Print reversed vector
    std::cout << "Reversed vector: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    // You can also use ranges::reverse with a view
    auto reversed_view = std::views::reverse(numbers);

    // Print using the reversed view
    std::cout << "Through reversed view: ";
    for (const auto& num : reversed_view) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    return 0;
}
Output:
Original vector: 1 2 3 4 5
Reversed vector: 5 4 3 2 1
Through reversed view: 1 2 3 4 5

What the Code Does

  • Creates a vector numbers containing integers {1, 2, 3, 4, 5}.
  • Prints the original vector using a range-based for loop.
  • Uses std::ranges::reverse to reverse the vector in place, changing its order to {5, 4, 3, 2, 1}.
  • Prints the reversed vector to confirm the modification.
  • Creates a reversed view of the vector using std::views::reverse.
    • The reversed view presents the vector in reverse order {1, 2, 3, 4, 5} when the vector is already reversed.
    • Views are lightweight and do not modify the original container, allowing dynamic transformations without copying data.
  • Prints the elements of the reversed view, reflecting the current state of the vector in reverse order again.

Advantages of ranges::reverse

  • Cleaner syntax - no need to specify .begin() and .end()
  • Better error messages when used incorrectly
  • Works with both containers and views
  • Can be combined with other ranges operations
  • Provides compile-time checks for reversible ranges

Custom Implementation

Sometimes you might want to implement your own reversal function for learning purposes or specific requirements. Here's how you can do it.

Custom Vector Reversal Implementation
#include <iostream>
#include <vector>

template<typename T>
void custom_reverse(std::vector<T>& vec) {
    // Get the size of the vector
    size_t n = vec.size();

    // Iterate through half of the vector
    for (size_t i = 0; i < n/2; ++i) {
        // Swap elements from start and end
        std::swap(vec[i], vec[n-1-i]);
    }
}

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

    std::cout << "Original: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    custom_reverse(numbers);

    std::cout << "Reversed: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    return 0;
}
Output:
Original: 1 2 3 4 5
Reversed: 5 4 3 2 1

What the Code Does

  • Defines a templated function custom_reverse that reverses a std::vector in place.
  • The custom_reverse function:
    • Calculates the size of the vector (n).
    • Iterates through the first half of the vector (0 to n/2).
    • Swaps elements symmetrically from the start and end of the vector using std::swap.
  • In the main function:
    • Initializes a std::vector called numbers with elements {1, 2, 3, 4, 5}.
    • Prints the elements of the original vector.
    • Calls the custom_reverse function to reverse the vector in place.
    • Prints the reversed vector to confirm the output is {5, 4, 3, 2, 1}.
  • This implementation provides a simple and educational way to reverse a vector without relying on built-in algorithms.

Using Reverse Iterators

C++ provides reverse iterators that allow us to traverse containers in reverse order. Here's how to use them for vector reversal.

Reverse Iterator Approach
#include <iostream>
#include <vector>

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

    // Reserve space for efficiency
    reversed.reserve(numbers.size());

    // Copy elements in reverse using reverse iterators
    std::copy(numbers.rbegin(), numbers.rend(),
              std::back_inserter(reversed));

    // Print both vectors
    std::cout << "Original: ";
    for (const auto& num : numbers) {
        std::cout << num << " ";
    }
    std::cout << "\nReversed: ";
    for (const auto& num : reversed) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    return 0;
}
Output:
Original: 1 2 3 4 5
Reversed: 5 4 3 2 1

What the Code Does

  • Includes necessary headers:
    • <iostream>: For input/output operations.
    • <vector>: To use the std::vector container.
  • Defines a std::vector named numbers with elements {1, 2, 3, 4, 5}.
  • Creates an empty vector reversed to store the reversed elements.
  • Uses reversed.reserve(numbers.size()) to pre-allocate memory for efficiency.
  • Uses std::copy with reverse iterators:
    • numbers.rbegin(): Points to the last element of the vector.
    • numbers.rend(): Points just before the first element of the vector.
    • std::back_inserter(reversed): Adds elements to the back of the reversed vector.
  • Prints both the original and reversed vectors using a range-based for loop.

Best Practices

  • Use std::reverse for most cases - it's optimized and well-tested
  • Consider reverse iterators when you need a new reversed copy
  • Implement custom solutions only when specific requirements demand it
  • Always consider whether in-place reversal or a new copy better suits your needs

Conclusion

Reversing a vector is a fundamental operation in C++ with multiple approaches to suit various needs. Whether you prefer the simplicity and efficiency of std::reverse, the modern syntax of std::ranges::reverse, or a custom implementation for educational purposes, each method has its unique advantages.

For most practical applications, std::reverse is the go-to solution, providing optimized performance and ease of use. However, understanding custom implementations or using reverse iterators can enhance your understanding of how these algorithms work under the hood.

As C++ evolves with features like the Ranges library, it's essential to stay updated with modern tools and techniques that make your code more readable, efficient, and robust.

Congratulations on reading to the end of this tutorial! For further exploration of vectors in C++, check out the resources below.

Have fun and happy coding!

Further Reading

  • C++ Online Compiler

    Test and run C++ code directly in your browser using this free online compiler. Perfect for practicing the techniques discussed in this guide.

  • std::reverse Documentation

    Comprehensive documentation on the std::reverse algorithm, including usage, syntax, and examples.

  • Reverse Iterator Documentation

    Learn about reverse iterators and how they provide a convenient way to iterate through containers in reverse.

  • std::vector Documentation

    An in-depth look at the std::vector container, including its methods, properties, and common use cases.

  • std::ranges::reverse Documentation

    Explore the modern std::ranges::reverse algorithm introduced in C++20, with details on syntax and examples.

  • Cplusplus.com: reverse

    Another resource for understanding std::reverse, with clear examples and explanations.

  • ISO C++

    The official C++ website offering resources, best practices, and updates about the C++ standard.

Attribution and Citation

If you found this guide helpful, feel free to link back to this page or cite it in your work!

Profile Picture
Senior Advisor, Data Science | [email protected] |  + posts

Suf is a senior advisor in data science with deep expertise in Natural Language Processing, Complex Networks, and Anomaly Detection. Formerly a postdoctoral research fellow, he applied advanced physics techniques to tackle real-world, data-heavy industry challenges. Before that, he was a particle physicist at the ATLAS Experiment of the Large Hadron Collider. Now, he’s focused on bringing more fun and curiosity to the world of science and research online.

Buy Me a Coffee ✨