November 2005
Beginner to intermediate
594 pages
16h 23m
English
You have a sequence of elements and you have to do something to each one, either in place or as it is copied to another sequence.
Use the transform or for_each standard algorithms. Both are simple, but allow you to do almost
anything you want to the elements in your sequence. See Example 7-9 for an illustration.
Example 7-9. Transforming data
#include <iostream>
#include <istream>
#include <string>
#include <list>
#include <algorithm>
#include <iterator>
#include <cctype>
#include "utils.h" // For printContainer(): see 7.10
using namespace std;
// Convert a string to upper case
string strToUpper(const string& s) {
string tmp;
for (string::const_iterator p = s.begin(); p != s.end(); ++p)
tmp += toupper(*p);
return(tmp);
}
string strAppend(const string& s1, const string& s2) {
return(s1 + s2);
}
int main() {
cout << "Enter a series of strings: ";
istream_iterator<string> start(cin);
istream_iterator<string> end;
list<string> lst(start, end), out;
// Use transform with an unary function...
transform(lst.begin(), lst.end(),
back_inserter(out),
strToUpper);
printContainer(out);
cin.clear();
cout << "Enter another series of strings: ";
list<string> lst2(++start, end);
out.clear();
// ...or a binary function and another input sequence.
transform(lst.begin(), lst.end(), lst2.begin(),
back_inserter(out),
strAppend);
printContainer(out);
}The obvious function for transforming data is transform. It has two forms. The first form ...