Replaces elements that have a special value while copying the whole range

View versions (1)

Definition

The replace_copy() algorithm is defined in the standard header <algorithm> and in the nonstandard backward-compatibility header <algo.h>.

Interface

#include <algorithm>
template < class InputIterator, class OutputIterator, class Type >
   OutputIterator replace_copy(
      InputIterator first, 
      InputIterator last, 
      OutputIterator result,
      const Type& oldVal, 
      const Type& newVal
   );

Parameters:

ParameterDescription
firstAn input iterator pointing to the position of the first element in the range from which elements are being replaced
lastAn input iterator pointing to the position one past the final element in the range from which elements are being replaced
resultAn output iterator pointing to the first element in the destination range to where the altered sequence of elements is being copied
oldValThe old value of the elements being replaced
newValThe new value being assigned to the elements with the old value

Description

Replace_copy algorithm makes a copy of a range and replaces all oldVal values by the value newVal into it. It uses operator= to make the copy and operator== to compare elements.

Return Value

The value return is an output iterator pointing to the position one past the final element in the destination range to where the altered sequence of elements is being copied.

Complexity

The complexity is linear; there are last - first comparisons for equality and last - first assignments.

References

Example 1
Problem

This program illustrates the functionality of replace_copy() algorithm.

Workings
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
  vector <int> vec1;
  list <int> lst1 (15);
  vector <int>::iterator Iter1;
  list <int>::iterator lstIter;
  int i,j;
  for (i = 0; i <= 9; i++)
    vec1.push_back(i);
  for (j = 0; j <= 3; j++)
    vec1.push_back(7);
  cout <<"The original vector vec1 data is:\n";
  for (Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
    cout <<*Iter1<<" ";
  cout <<endl;
  random_shuffle(vec1.begin(), vec1.end());
  int k;
  for (k = 0; k <= 15; k++)
    vec1.push_back(1);
  cout <<"The original random shuffle vector vec1 with appended data is:\n";
  for (Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
    cout <<*Iter1<<" ";
  cout <<endl;
  // replace elements in one part of a vector with a value of 7 
  // with a value of 70 and copy into another part of the vector
  replace_copy(vec1.begin(), vec1.begin() + 14, vec1.end( )-15, 7, 70);
  cout <<"The vector vec1 data with a replacement value of 7 is:\n";
  for (Iter1 = vec1.begin(); Iter1 != vec1.end(); Iter1++)
    cout <<*Iter1<<" ";
  cout <<endl;
   // replace elements in a vector of a value 70 with a value of 1 and copy into a list
  replace_copy(vec1.begin(), vec1.begin() + 14, lst1.begin(), 70, 1);
  cout <<"The list copy lst1 of vec1 with the value 0 replacing the 7 is:\n";
  for (lstIter = lst1.begin(); lstIter != lst1.end(); lstIter++)
    cout <<*lstIter<<" ";
  cout <<endl;

  return 0;
}
Solution

Output:

The original vector vec1 data is:
0 1 2 3 4 5 6 7 8 9 7 7 7 7
The original random shuffle vector vec1 with appended data is:
7 1 9 2 0 7 7 3 4 6 8 5 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
The vector vec1 data with a replacement value of 7 is:
7 1 9 2 0 7 7 3 4 6 8 5 7 7 1 70 1 9 2 0 70 70 3 4 6 8 5 70 70 1
The list copy lst1 of vec1 with the value 0 replacing the 7 is:
7 1 9 2 0 7 7 3 4 6 8 5 7 7 0

See Also