Algorithm Reverse Copy Function - C++ Programming Tutorial
C++ Course / STL Algorithm / Algorithm Reverse Copy Function

Algorithm Reverse Copy Function

BLUF: Mastering Algorithm Reverse Copy Function is a critical step in becoming a proficient C++ developer. This lesson provides a deep dive into the syntax, performance considerations, and real-world applications of this concept.
Key Performance Insight: Algorithm Reverse Copy Function

C++ is renowned for its efficiency. Learn how Algorithm Reverse Copy Function enables low-level control and high-performance computing in the tutorial below.

The C++ reverse_copy function is employed to duplicate the elements from the range [first, last) to a different range that starts at result, ensuring that the elements are arranged in reverse order.

Syntax

Example

template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy (BidirectionalIterator first,
BidirectionalIterator last, OutputIterator result);

Note: BidirectionalIterator is an iterator which is used to access any elements of a container in both forward and backward direction.

Parameter

A bidirectional iterator indicates the location of the initial element within the range where the elements are being reversed.

last: A forward iterator indicating the position immediately after the last element in the range where the elements are being reversed.

The result is an output iterator that points to the starting position of the range where elements are being duplicated.

Return value

This function provides an output iterator that points to the end of the destination range [first, last), where the modified sequence of elements is being copied.

Complexity

The complexity increases linearly within the specified range [initial, final) during the process of assigning values to individual elements.

Data races

The items within the range [first, last) are being accessed.

The items within the range from the outcome to the value that is handed back are altered.

Exceptions

This function raises an exception when either an element assignment or an operation on iterator results in an exception.

Note: The invalid parameters cause an undefined behavior.

Example 1

Let's explore a basic example to showcase the functionality of reverse_copy:

Example

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

using namespace std;
 
int main()
{    
    vector<int> v({1,2,3});
    cout << "Before: ";
    for (const auto& value : v) {
        cout << value << " ";
    }
    cout << '\n';

    vector<int> destination(3);
    reverse_copy(begin(v), end(v), begin(destination));
    cout << "After:  ";
    for (const auto& value : destination) {
        cout <<value << " ";
    }
    cout << '\n';
    
    return 0;
}

Output:

Output

Before: 1 2 3 
After:  3 2 1

Example 2

Let's explore another straightforward illustration of reversing a string:

Example

#include <algorithm>
#include <iostream>
#include <string>
#include <iterator>

using namespace std;

int main() {
  string str = "Hello Myself Nikita";
  cout<<"Before Reverse: "<< str<< endl;
  
  cout<<"After Reverse: ";
  reverse_copy(str.begin(), str.end(),
    ostream_iterator<char>(cout, ""));
    
    return 0;
}

Output:

Output

Before Reverse: Hello Myself Nikita
After Reverse: atikiN flesyM olleH

Example 3

Let's explore another straightforward example of reversing a range of numbers:

Example

#include <vector>  
#include <algorithm>  
#include <iostream>  
  
int main( ) {  
   using namespace std;  
   vector <int> v1, v2( 10 );  
   vector <int>::iterator Iter1, Iter2;  
  
   int i;  
   for ( i = 0 ; i <= 9 ; i++ )  
   {  
      v1.push_back( i );  
   }  
  
   cout << "The original vector v1 is:\n ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl;  
  
   // Reverse the elements in the vector   
   reverse_copy (v1.begin( ), v1.end( ), v2.begin( ) );  
  
   cout << "The copy v2 of the reversed vector v1 is:\n ( " ;  
   for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )  
      cout << *Iter2 << " ";  
   cout << ")." << endl;  
  
   cout << "The original vector v1 remains unmodified as:\n ( " ;  
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )  
      cout << *Iter1 << " ";  
   cout << ")." << endl;  
   
   return 0;
}

Output:

Output

The original vector v1 is:
 ( 0 1 2 3 4 5 6 7 8 9 ).
The copy v2 of the reversed vector v1 is:
 ( 9 8 7 6 5 4 3 2 1 0 ).
The original vector v1 remains unmodified as:
 ( 0 1 2 3 4 5 6 7 8 9 ).

Example 4

Let's see another simple example:

Example

#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <iterator>

using namespace std;
 
void print(string a[], int N)
{   
    for(int i = 0; i < N; i++)
    {
        cout << (i + 1) << ". " << setw(5)
             << a[i] << "  ";
    }
    cout << endl;
}
 
int main()
{
    string s[] = {"George", "John", "Nikki", "Alice", "Bob", "Watson"};
    string t[6];
 
    cout << "Original order : ";
    print(s, 6);
    cout << "\nReversing the order ... " << endl;
    // Doesn't modify original array s[]
    reverse_copy(s, s + 6, t);
    cout << "Reversed order : ";
    print(t, 6);
    
    return 0;
}

Output:

Output

Original order : 1. George  2.  John  3. Nikki  4. Alice  5.   Bob  6. Watson  

Reversing the order ... 
Reversed order : 1. Watson  2.   Bob  3. Alice  4. Nikki  5.  John  6. George

Input Required

This code uses input(). Please provide values below:

Logic Practice
Install Logic Practice
Add to home screen for a faster app-like experience