7.9. Transforming Elements in a Sequence
Problem
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.
Solution
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); }
Discussion
The obvious function for transforming data is transform
. It has two forms. The first form ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.