Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ replace_copy_if(3C++) — Sun WorkShop 5.0

Media Vault

Software Library

Restoration Projects

Artifacts Sought

replace_copy_if(3C++)

Standard C++ Library
Copyright 1998, Rogue Wave Software, Inc.

 

NAME

 
replace_copy_if
 
 - Substitutes elements in a collection with new values, and moves the revised sequence into result. 
 
 
 

SYNOPSIS

 
 

#include <algorithm>
template <class InputIterator,

class OutputIterator,
class Predicate,
class T>

OutputIterator replace_copy_if (InputIterator first,

InputIterator last,
OutputIterator result,
Predicate pred,
const T& new_value);
 
 
 

DESCRIPTION

 
 
The replace_copy_if algorithm leaves the original sequence intact and places a revised sequence into result. For the range [first,last), the algorithm compares each element ∗i with the conditions specified by pred.   If pred(∗i)==false, replace_copy_if copies ∗i to result+(first-i). If pred(∗i)==true, then replace_copy copies new_value to result+(first-i). replace_copy_if_returns result+(last-first). 
 
 
 

COMPLEXITY

 
 
Exactly last - first applications of the predicate are performed. 
 
 
 

EXAMPLE

 
 
 

//
// replace.cpp
//

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

using namespace std;
 
template<class Arg>
struct all_true : public unary_function<Arg, bool>

{

bool operator() (const Arg&) { return 1; }

};

 
int main ()

{

//
// Initialize a vector with an array of integers.
//

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
vector<int> v(arr+0, arr+10);

//
// Print out original vector.
//

cout << "The original list: " << endl << "     ";
copy(v.begin(), v.end(),

ostream_iterator<int,char>(cout," "));

cout << endl << endl;

//
// Replace the number 7 with 11.
//

replace(v.begin(), v.end(), 7, 11);

//
// Print out vector with 7 replaced.
//

cout << "List after replace:" << endl << "     ";
copy(v.begin(), v.end(),

ostream_iterator<int,char>(cout," "));

cout << endl << endl;

//
// Replace 1 2 3 with 13 13 13.
//

replace_if(v.begin(), v.begin()+3, all_true<int>(), 13);

//
// Print out the remaining vector.
//

cout << "List after replace_if:" << endl << "     ";
copy(v.begin(), v.end(),

ostream_iterator<int,char>(cout," "));

cout << endl << endl;

//
// Replace those 13s with 17s on output.
//

cout << "List using replace_copy to cout:" << endl

<< "     ";

replace_copy(v.begin(), v.end(),

ostream_iterator<int,char>(cout, " "),
13, 17);

cout << endl << endl;

//
// A simple example of replace_copy_if.
//

cout << "List w/ all elements output as 19s:" << endl

<< "   ";

replace_copy_if(v.begin(), v.end(), <br>                   ostream_iterator<int,char>(cout, " "),

all_true<int>(), 19);

cout << endl;

 

return 0;

}
 

Program Output
 
 
 

 
The original list:

1 2 3 4 5 6 7 8 9 10

List after replace:

1 2 3 4 5 6 11 8 9 10

List after replace_if:

13 13 13 4 5 6 11 8 9 10

List using replace_copy to cout:

17 17 17 4 5 6 11 8 9 10

List with all elements output as 19s:

19 19 19 19 19 19 19 19 19 19
 
 
 

WARNINGS

 
 
If your compiler does not support default template parameters, then you always need to supply the Allocator template argument. For instance, you need to write:
 
vector<int, allocator<int> >
 
instead of:
 
vector<int>
 
If your compiler does not support namespaces, then you do not need the using declaration for std. 
 
 
 

SEE ALSO

 
 
replace, replace_if, replace_copy
 

Rogue Wave Software  —  Last change: 02 Apr 1998

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026