I l@ve RuBoard |
![]() ![]() |
Exercise 3.4Write a program to read a sequence of integer numbers from standard input using an istream_iterator. Write the odd numbers into one file using an ostream_iterator. Each value should be separated by a space. Write the even numbers into a second file, also using an ostream_iterator. Each of these values should be placed on a separate line. To read a sequence of integers from standard input, we define two istream_iterators: one bound to cin, and the second representing end-of-file. istream_iterator<int> in( cin ), eos; Next, we define a vector to hold the elements read: vector< int > input; To perform the reading, we use the copy() generic algorithm: #include <iterator> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector< int > input; istream_iterator in( cin ), eos; copy( in, eos, back_inserter( input )); // ... } The back_inserter() is necessary because copy() uses the assignment operator to copy each element. Because input is empty, the first element assignment would cause an overflow error. back_inserter() overrides the assignment operator. The elements are now inserted using push_back(). We partition the elements into even and odd using the partition() generic algorithm and an even_elem function object that evaluates to true if the value is even: class even_elem { public: bool operator()( int elem ) { return elem%2 ? false : true; } }; vector<int>::iterator division = partition( input.begin(), input.end(), even_elem() ); We need two ostream_iterators: one for the even number file and one for the odd number file. We first open two files for output using the ofstream class: #include <fstream> ofstream even_file( "C:\\My Documents\\even_file" ), odd_file( "C:\\My Documents\\odd_file" ); if ( ! even_file || ! odd_file ) { cerr << "arghh!! unable to open the output files. bailing out!"; return ?; } We bind our two ostream_iterators to the respective ofstream objects. The second string argument indicates the delimiter to output following the output of each element. ostream_iterator<int> even_iter( even_file, "\n" ), odd_iter( odd_file, " " ); Finally, we use the copy() generic algorithm to output the partitioned elements: copy( input.begin(), division, even_iter ); copy( division, input.end(), odd_iter ); For example, I entered the following sequence of numbers: 2 4 5 3 9 5 2 6 8 1 8 4 5 7 3 At that point, even_file contained the following values: 2 4 4 8 8 6 2, whereas odd_file contained these values: 5 9 1 3 5 5 7 3. The partition() algorithm does not preserve the order of the values. If preserving the order of the values is important, we would instead use the stable_partition() generic algorithm. Both the stable_sort() and stable_partition() algorithms maintain the elements' relative order. |
I l@ve RuBoard |
![]() ![]() |