blob: 78ffcbb7c12b1d4f88834a07b0867cb221cd5a70 [file] [log] [blame]
/**************************************************************************
*
* alg6.cpp - STL generic algorithms that produce new sequences.
*
* $Id$
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* Copyright 1994-2006 Rogue Wave Software.
*
**************************************************************************/
#include <vector>
#include <list>
#include <functional>
#include <algorithm>
#include <numeric>
#include <iostream>
#include <iterator>
#include <functional>
#include <examples.h>
typedef std::ostream_iterator<int, char, std::char_traits<char> > ostrm_iter_type;
int square (int n) {
return n * n;
}
class iotaGen {
public:
iotaGen (int iv) : current (iv)
{ }
int operator () () {
return current++;
}
private:
int current;
};
// Illustrate the use of the transform algorithm.
void transform_example () {
// Generate a std::list of values from 1 to 6.
std::list<int, std::allocator<int> > aList;
std::generate_n (std::inserter (aList, aList.begin ()), 6, iotaGen (1));
std::cout << "Original list: ";
std::copy (aList.begin (), aList.end (), ostrm_iter_type (std::cout, " "));
std::cout << std::endl;
// Transform elements by squaring, copy into std::vector.
std::vector<int, std::allocator<int> > aVec (6);
std::transform (aList.begin (), aList.end (), aVec.begin (), square);
std::cout << "After squaring: ";
std::copy (aVec.begin (), aVec.end (), ostrm_iter_type (std::cout, " "));
std::cout << std::endl;
// Transform std::vector again, in place, yielding 4th powers.
std::transform (aVec.begin (), aVec.end (), aVec.begin (), square);
std::cout << "After squaring again: ";
std::copy (aVec.begin (), aVec.end (),ostrm_iter_type (std::cout, " "));
std::cout << std::endl;
// Transform in parallel, yielding cubes.
std::vector<int, std::allocator<int> > cubes (6);
std::transform (aVec.begin (), aVec.end (), aList.begin (), cubes.begin (),
std::divides<int> ());
std::cout << "After division: ";
std::copy (cubes.begin (), cubes.end (), ostrm_iter_type (std::cout, " "));
std::cout << std::endl;
}
// Illustrate the use of the partial sum algorithm.
void partial_sum_example () {
// Generate values 1 to 5.
std::vector<int, std::allocator<int> > aVec (5);
std::generate (aVec.begin (), aVec.end (), iotaGen (1));
// Output partial sums.
std::cout << "Partial sums examples" << std::endl;
std::cout << "Partial sums : ";
std::partial_sum (aVec.begin (), aVec.end (),
ostrm_iter_type (std::cout, " "));
std::cout << std::endl;
// Output partial products.
std::cout << "Partial products: ";
std::partial_sum (aVec.begin (), aVec.end (),
ostrm_iter_type (std::cout, " "), std::multiplies<int> () );
std::cout << std::endl;
}
// Illustrate the use of the adjacent difference algorithm.
void adjacent_difference_example () {
// Generate values 1 to 5.
std::vector<int, std::allocator<int> > aVec (5);
std::generate (aVec.begin (), aVec.end (), iotaGen (1));
// Output partial sums.
std::cout << "Adjacent Differences examples" << std::endl;
std::cout << "Adjacent Differences : ";
std::adjacent_difference
(aVec.begin (), aVec.end (), ostrm_iter_type (std::cout, " "));
std::cout << std::endl;
// Output partial products.
std::cout << "Adjacent sums: ";
std::adjacent_difference (aVec.begin (), aVec.end (),
ostrm_iter_type (std::cout, " "),
std::plus<int> ());
std::cout << std::endl;
}
int main () {
std::cout << "STL generic algorithms -- that transform sequences"
<< std::endl;
transform_example ();
partial_sum_example ();
adjacent_difference_example ();
std::cout << "End generic transform algorithms example" << std::endl;
return 0;
}