Wiki

Руководство по стандартной библиотеке шаблонов (STL) - примеры

Примеры программ с шаблонами

Эти примеры демонстрируют использование нового продукта STL<ToolKit> от компании ObjectSpace. STL<ToolKit> - это самый простой способ использования STL, который работает на большинстве комбинаций платформ/компиляторов, включая cfront, Borland, Visual C++, Set C++, ObjectCenter и последние компиляторы от Sun&HP.

accum1.cpp

#include <ospace/stl.h>
#include 
int main ()
{
  vector <int> v (5);
  for (int i = 0; i < v.size (); i++)
    v[i] = i + 1;
  int sum = accumulate (v.begin (), v.end (), 0);
  cout << "sum = " << sum << endl;
  return 0;
}

accum2.cpp

#include <stl.h>
#include 
int mult (int initial_, int element_)
{
  return initial_ * element_;
}
int main ()
{
  vector <int> v (5);
  for (int i = 0; i < v.size (); i++)
    v[i] = i + 1;
  int prod = accumulate (v.begin (), v.end (), 1, mult);
  cout << "prod = " << prod << endl;
  return 0;
}

search2.cpp

#include <stl.h>
#include 
#include 
bool str_equal (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) == 0 ? 1 : 0;
}
char* grades[] = { "A", "B", "C", "D", "F" };
char* letters[] = { "Q", "E", "D" };
int main ()
{
  const unsigned gradeCount = sizeof (grades) / sizeof (grades[0]);
  const unsigned letterCount = sizeof (letters) / sizeof (letters[0]);
  ostream_iterator <char*> iter (cout, "
      ");
  cout << "grades: ";
  copy (grades, grades + gradeCount, iter);
  cout << "\nletters:";
  copy (letters, letters + letterCount, iter);
  cout << endl;
  char** location =
    search (grades, grades + gradeCount,
            letters, letters + letterCount,
            str_equal);
  if (location == grades + gradeCount)
    cout << "letters not found in grades" << endl;
  else
    cout << "letters found in grades at offset: " << location - grades << endl;
  copy (grades + 1, grades + 1 + letterCount, letters);
  cout << "grades: ";
  copy (grades, grades + gradeCount, iter);
  cout << "\nletters:";
  copy (letters, letters + letterCount, iter);
  cout << endl;
  location = search (grades, grades + gradeCount,
                     letters, letters + letterCount,
                     str_equal);
  if (location == grades + gradeCount)
    cout << "letters not found in grades" << endl;
  else
    cout
      << "letters found in grades at offset: " << location - grades << endl;
  return 0;
}

incl2.cpp

#include <stl.h>
#include 
#include 
bool compare_strings (const char* s1_, const char* s2_)
{
  return ::strcmp (s1_, s2_) < 0 ? 1 : 0;
}
char* names[] = {  "Todd", "Mike", "Graham", "Jack", "Brett"};
int main ()
{
  const unsigned nameSize = sizeof (names)/sizeof (names[0]);
  vector <char*> v1(nameSize);
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = names[i];
  }
  vector <char*> v2 (2);
  v2[0] = "foo";
  v2[1] = "bar";
  sort (v1.begin (), v1.end (), compare_strings);
  sort (v2.begin (), v2.end (), compare_strings);
  bool inc = includes (v1.begin (), v1.end (),
                       v2.begin (), v2.end (),
                       compare_strings);
  if (inc)
    cout << "v1 includes v2" << endl;
  else
    cout << "v1 does not include v2" << endl;
  v2[0] = "Brett";
  v2[1] = "Todd";
  inc = includes (v1.begin (), v1.end (),
                  v2.begin (), v2.end (),
                  compare_strings);
  if (inc)
    cout << "v1 includes v2" << endl;
  else
    cout << "v1 does not include v2" << endl;
  return 0;
}

search1.cpp

#include <stl.h>
#include 
int main ()
{
  typedef vector <int> IntVec;
  IntVec v1 (10);
  iota (v1.begin (), v1.end (), 0);
  IntVec v2 (3);
  iota (v2.begin (), v2.end (), 50);
  ostream_iterator <int> iter (cout, "
      ");
  cout << "v1: ";
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  cout << "v2: ";
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  IntVec::iterator location;
  location = search (v1.begin (), v1.end (), v2.begin (), v2.end ());
  if (location == v1.end ())
    cout << "v2 not contained in v1" << endl;
  else
    cout << "Found v2 in v1 at offset: " << location - v1.begin () << endl;
  iota (v2.begin (), v2.end (), 4);
  cout << "v1: ";
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  cout << "v2: ";
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  location = search (v1.begin (), v1.end (), v2.begin (), v2.end ());
  if (location == v1.end ())
    cout << "v2 not contained in v1" << endl;
  else
    cout << "Found v2 in v1 at offset: " << location - v1.begin () << endl;
  return 0;
}

istmit2.cpp

#include 
#include 
#include <stl.h>
typedef vector<char> Line;
void printLine (const Line* line_)
{
  vector<char>::const_iterator i;
  for (i = line_->begin (); i != line_->end (); i++)
   cout << *i;
  cout << endl;
}
int main ()
{
  Line buffer;
  vector<Line*> lines;
  ifstream s ("data.txt");
  s.unsetf (ios::skipws); // Disable white-space skipping.
  istream_iterator it1 (s); // Position at start of file.
  istream_iterator it2; //
      Serves as "past-the-end" marker.
  copy (it1, it2, back_inserter (buffer));
  Line::iterator i = buffer.begin ();
  Line::iterator p;
  while (i != buffer.end ())
  {
    p = find (i, buffer.end (), '\n');
    lines.push_back (new Line (i, p));
    i = ++p;
  }
  sort (lines.begin (), lines.end (), less_p<Line*> ());
  cout << "Read " << lines.size () << " lines" << endl;
  vector<Line*>::iterator j;
  for (j = lines.begin (); j != lines.end (); j++)
    printLine (*j);
  release (lines.begin (), lines.end ()); // Release memory.
  return 0;
}

alloc1.cpp

#include <stl.h>
#include <ospace/stl/examples/myaloc.h>
int main ()
{
  {
    cout << "vectors:" << endl;
    os_my_allocator<int> alloc;
    vector<int> v3 (alloc);
    v3.push_back (42);
    vector<int> v4 (alloc);
    v4.push_back (42);
  }
  {
    cout << "bit_vectors:" << endl;
    os_my_allocator<unsigned int> alloc;
    bit_vector v1 (alloc);
    v1.push_back (1);
  }
  {
    cout << "deques:" << endl;
    os_my_allocator<int> alloc;
    deque<int> d (alloc);
    d.push_back (42);
  }
  {
    cout << "lists:" << endl;
    os_my_allocator<os_list_node<int> > alloc;
    list<int> l (alloc);
    l.push_back (42);
  }
  {
    cout << "sets:" << endl;
    os_my_allocator<os_value_node<int> > alloc;
    set<int, less<int> > s (alloc);
    s.insert (42);
  }
  {
    cout << "maps" << endl;
    os_my_allocator<os_value_node<os_pair<const int, float> > > alloc;
    map<int, float, less<int> > m (alloc);
    m[4] = 2.0;
  }
  return 0;
}

release2.cpp

#include <stl.h>
#include 
class X
{
  public:
    X (int i_) : i (i_) {}
    ~X () { cout << "Delete X(" << i << ")" << endl; }
    int i;
};
ostream& operator << (ostream& stream_, const X& x_)
{
  return stream_ << "X(" << x_.i << ")";
}
int main ()
{
  vector<X*> v;
  v.push_back (new X (2));
  v.push_back (new X (1));
  v.push_back (new X (4));
  vector<X*>::iterator i;
  cout << "Initial contents:" << endl;
  for (i = v.begin (); i != v.end (); i++)
    cout << " " << *(*i) << endl;
  release (v.begin ()); // Delete the first heap-based object.
  v.erase (v.begin ()); // Erase the first element. 
  cout << "Remaining contents:" << endl;
  for (i = v.begin (); i != v.end (); i++)
    cout << " " << *(*i) << endl;
  release (v.begin (), v.end ()); // Delete remaining heap-based
      objects.
  v.erase (v.begin (), v.end ()); // Erase remaining elements.
  return 0;
}

map1.cpp

#include 
#include <stl.h>
int main ()
{
  typedef map<char, int, less<char> > maptype;
  maptype m;
  // Store mappings between roman numerals and decimals.
  m['l'] = 50;
  m['x'] = 20; //
      Deliberate mistake.
  m['v'] = 5;
  m['i'] = 1;
  cout << "m['x'] = " << m['x'] << endl;
  m['x'] = 10; //
      Correct mistake.
  cout << "m['x'] = " << m['x'] << endl;
  cout << "m['z'] = " << m['z'] << endl; // Note default value is added.
  cout << "m.count ('z') = " << m.count ('z') << endl;
  pair<maptype::iterator, bool> p;
  p = m.insert (pair<const char, int> ('c', 100));
  if (p.second)
    cout << "First insertion successful" << endl;
  p = m.insert (pair<const char, int> ('c', 100));
  if (p.second)
    cout << "Second insertion successful" << endl;
  else
    cout << "Existing pair " << (*(p.first)).first
         << " -> " << (*(p.first)).second << endl;
  return 0;
}

mismtch2.cpp

#include <stl.h>
#include 
#include 
bool str_equal (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) == 0 ? 1 : 0;
}
const unsigned size = 5;
char* n1[size] = { "Brett", "Graham", "Jack", "Mike", "Todd" };
int main ()
{
  char* n2[size];
  copy (n1, n1 + 5, n2);
  pair <char**, char**> result;
  result = mismatch (n1, n1+ size, n2, str_equal);
  if (result.first == n1 + size && result.second == n2 + size)
    cout << "n1 and n2 are the same" << endl;
  else
    cout << "mismatch at index: " << (result.first - n1) << endl;
  n2[2] = "QED";
  result = mismatch (n1, n1 + size, n2, str_equal);
  if (result.first == n2 + size && result.second == n2 + size)
    cout << "n1 and n2 are the same" << endl;
  else
    cout << "mismatch at index: " << (result.first - n1) << endl;
  return 0;
}

mismtch1.cpp

#include <stl.h>
#include 
int main ()
{
  typedef vector<int> IntVec;
  IntVec v1 (10);
  IntVec v2 (v1.size ());
  iota (v1.begin (), v1.end (), 0);
  iota (v2.begin (), v2.end (), 0);
  pair <IntVec::iterator, IntVec::iterator> result;
  result = mismatch (v1.begin (), v1.end (), v2.begin ());
  if (result.first == v1.end () && result.second == v2.end ())
    cout << "v1 and v2 are the same" << endl;
  else
    cout << "mismatch at index: " << (result.first - v1.begin ()) << endl;
  v2[v2.size()/2] = 42;
  result = mismatch (v1.begin (), v1.end (), v2.begin ());
  if (result.first == v1.end () && result.second == v2.end ())
    cout << "v1 and v2 are the same" << endl;
  else
    cout << "mismatch at index: " << (result.first - v1.begin ()) << endl;
  return 0;
}

mmap2.cpp

#include 
#include <stl.h>
typedef multimap<int, char, less<int> > mmap;
typedef pair<const int, char> pair_type;
pair_type p1 (3, 'c');
pair_type p2 (6, 'f');
pair_type p3 (1, 'a');
pair_type p4 (2, 'b');
pair_type p5 (3, 'x');
pair_type p6 (6, 'f');
pair_type array [] =
  {
    p1,
    p2,
    p3,
    p4,
    p5,
    p6
  };
int main ()
{
  mmap m (array, array + 7);
  mmap::iterator i;
  // Return location of first element that is not less than 3
  i = m.lower_bound (3);
  cout << "lower bound:" << endl;
  cout << (*i).first << " -> " << (*i).second << endl;
  // Return location of first element that is greater than 3
  i = m.upper_bound (3);
  cout << "upper bound:" << endl;
  cout << (*i).first << " -> " << (*i).second << endl;
  return 0;
}

adjfind2.cpp

#include <stl.h>
#include 
#include 
typedef vector <char*> CStrVector;
int equal_length (const char* v1_, const char* v2_)
{
  return ::strlen (v1_) == ::strlen(v2_);
}
char* names[] = { "Brett", "Graham", "Jack", "Mike", "Todd" };
int main ()
{
  const int nameCount = sizeof (names)/sizeof(names[0]);
  CStrVector v (nameCount);
  for (int i = 0; i < nameCount; i++)
    v[i] = names[i];
  CStrVector::iterator location;
  location = adjacent_find (v.begin (), v.end (), equal_length);
  if (location != v.end ())
    cout
      << "Found two adjacent strings of equal length: "
      << *location
      << " -and- "
      << *(location + 1)
      << endl;
  else
    cout << "Didn't find two adjacent strings of equal length.";
  return 0;
}

list3.cpp

#include 
#include <stl.h>
char array [] = { 'x', 'l', 'x', 't', 's', 's' };
int main ()
{
  list<char> str (array, array + 6);
  list<char>::iterator i;
  cout << "original: ";
  for (i = str.begin (); i != str.end (); i++)
    cout << *i;
  cout << endl;
  cout << "reversed: ";
  str.reverse ();
  for (i = str.begin (); i != str.end (); i++)
    cout << *i;
  cout << endl;
  cout << "removed: ";
  str.remove ('x');
  for (i = str.begin (); i != str.end (); i++)
    cout << *i;
  cout << endl;
  cout << "uniqued: ";
  str.unique ();
  for (i = str.begin (); i != str.end (); i++)
    cout << *i;
  cout << endl;
  cout << "sorted: ";
  str.sort ();
  for (i = str.begin (); i != str.end (); i++)
    cout << *i;
  cout << endl;
  return 0;
}

parsrtc2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* names[] = { "aa", "ff", "dd", "ee", "cc", "bb" };
int main ()
{
  const unsigned nameSize = sizeof (names) / sizeof (names[0]);
  vector <char*> v1 (nameSize);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = names[i];
  ostream_iterator<char*> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  vector <char*> result (5);
  partial_sort_copy (v1.begin (),
                     v1.end (),
                     result.begin (),
                     result.end (),
                     str_compare);
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

vec6.cpp

#include 
#include <stl.h>
int array [] = { 1, 4, 9, 16, 25, 36 };
int main ()
{
  vector<int> v (array, array + 6);
  for (int i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  cout << endl;
  v.erase (v.begin ()); // Erase first element.
  for (i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  cout << endl;
  v.erase (v.end () - 1); // Erase last
      element.
  for (i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  cout << endl;
  v.erase (v.begin () + 1, v.end () - 1); // Erase all but first and last.
  for (i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  cout << endl;
  v.erase (); // Erase all.
  return 0;
}

inrprod2.cpp

#include <stl.h>
#include 
#include 
int add (int a_, int b_)
{
  return a_ + b_;
}
int mult (int a_, int b_)
{
  return a_ * b_;
}
int main ()
{
  vector <int> v1 (3);
  vector <int> v2 (v1.size ());
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = i + 1;
    v2[i] = v1.size () - i;
  }
  ostream_iterator<int> iter (cout, "
      ");
  cout << "Inner product (product of sums):\n\t";
  copy (v1.begin (), v1.end (), iter);
  cout << "\n\t";
  copy (v2.begin (), v2.end (), iter);
  int result =
    inner_product (v1.begin (), v1.end (),
                   v2.begin (),
                   1,
                   mult, add);
  cout << "\nis: " << result << endl;
  return 0;
}

mmap1.cpp

#include 
#include <stl.h>
int main ()
{
  typedef multimap<char, int, less<char> > mmap;
  mmap m;
  cout << "count ('X') = " << m.count ('X') << endl;
  m.insert (pair<const char, int> ('X', 10)); //
          Standard way.
  cout << "count ('X') = " << m.count ('X') << endl;
  m.insert ('X', 20); // Non-standard, but very convenient!
  cout << "count ('X') = " << m.count ('X') << endl;
  m.insert ('Y', 32);
  mmap::iterator i = m.find ('X'); //
      Find first match.
  while (i != m.end ()) // Loop until
      end is reached.
  {
    cout << (*i).first << " -> " << (*i).second << endl;
    i++;
  }
  int count = m.erase ('X');
  cout << "Erased " << count << " items" << endl;
  return 0;
}

adjfind0.cpp

#include <stl.h>
#include 
int numbers1 [5] = { 1, 2, 4, 8, 16 };
int numbers2 [5] = { 5, 3, 2, 1, 1 };
int main ()
{
  int* location = adjacent_find (numbers1, numbers1 + 5);
  if (location != numbers1 + 5)
    cout
      << "Found adjacent pair of: "
      << *location
      << " at offset "
      << (location - numbers1)
      << endl;
  else
    cout << "No adjacent pairs" << endl;
  location = adjacent_find (numbers2, numbers2 + 5);
  if (location != numbers2 + 5)
    cout
      << "Found adjacent pair of: "
      << *location
      << " at offset "
      << (location - numbers2)
      << endl;
  else
    cout << "No adjacent pairs" << endl;
  return 0;
}

parsrt2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* names[] = { "aa", "ff", "dd", "ee", "cc", "bb" };
int main ()
{
  const unsigned nameSize = sizeof (names) / sizeof (names[0]);
  vector <char*> v1 (nameSize);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = names[i];
  ostream_iterator<char*> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  partial_sort (v1.begin (),
                v1.begin () + nameSize / 2,
                v1.end (),
                str_compare);
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

mset5.cpp

#include 
#include <stl.h>
bool less_than (int a_, int b_)
{
  return a_ < b_;
}
bool greater_than (int a_, int b_)
{
  return a_ > b_;
}
int array [] = { 3, 6, 1, 9 };
int main ()
{
  typedef pointer_to_binary_function<int, int, bool> fn_type;
  typedef multiset<int, fn_type> mset;
  fn_type f (less_than);
  mset s1 (array, array + 4, f);
  mset::const_iterator i = s1.begin ();
  cout << "Using less_than: " << endl;
  while (i != s1.end ())
    cout << *i++ << endl;
  fn_type g (greater_than);
  mset s2 (array, array + 4, g);
  i = s2.begin ();
  cout << "Using greater_than: " << endl;
  while (i != s2.end ())
    cout << *i++ << endl;
  return 0;
}

mset1.cpp

#include 
#include <stl.h>
int main ()
{
  typedef multiset<int, less<int> > mset;
  mset s;
  cout << "count (42) = " << s.count (42) << endl;
  s.insert (42);
  cout << "count (42) = " << s.count (42) << endl;
  s.insert (42);
  cout << "count (42) = " << s.count (42) << endl;
  set<int, less<int> >::iterator i = s.find (40);
  if (i == s.end ())
    cout << "40 Not found" << endl;
  else
    cout << "Found " << *i << endl;
  i = s.find (42);
  if (i == s.end ())
    cout << "Not found" << endl;
  else
    cout << "Found " << *i << endl;
  int count = s.erase (42);
  cout << "Erased " << count << " instances" << endl;
  return 0;
}

vec2.cpp

#include 
#include <stl.h>
void print (vector<double>& vector_)
{
  for (int i = 0; i < vector_.size (); i++)
    cout << vector_[i] << " ";
  cout << endl;
}
int main ()
{
  vector<double> v1; // Empty
      vector of doubles.
  v1.push_back (32.1);
  v1.push_back (40.5);
  vector<double> v2; // Another
      empty vector of doubles.
  v2.push_back (3.56);
  cout << "v1 = ";
  print (v1);
  cout << "v2 = ";
  print (v2);
  v1.swap (v2); // Swap the vector's contents.
  cout << "v1 = ";
  print (v1);
  cout << "v2 = ";
  print (v2);
  v2 = v1; // Assign one vector to another.
  cout << "v2 = ";
  print (v2);
  return 0;
}

uniqcpy2.cpp

#include <stl.h>
#include 
#include 
bool str_equal (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) == 0 ? 1 : 0;
}
char* labels[] = { "Q","Q","W","W","E","E","R","T","T","Y","Y" };
int main ()
{
  const unsigned count = sizeof (labels) / sizeof (labels[0]);
  ostream_iterator <char*> iter (cout);
  copy (labels, labels + count, iter);
  cout << endl;
  char* uCopy[count];
  fill (uCopy, uCopy + count, "");
  unique_copy (labels, labels + count, uCopy, str_equal);
  copy (labels, labels + count, iter);
  cout << endl;
  copy (uCopy, uCopy + count, iter);
  cout << endl;
  return 0;
}

mismtch0.cpp

#include <stl.h>
#include 
int n1[5] = { 1, 2, 3, 4, 5 };
int n2[5] = { 1, 2, 3, 4, 5 };
int n3[5] = { 1, 2, 3, 2, 1 };
int main ()
{
  pair <int*, int*> result;
  result = mismatch (n1, n1 + 5, n2);
  if (result.first == (n1 + 5) && result.second == (n2 + 5))
    cout << "n1 and n2 are the same" << endl;
  else
    cout << "Mismatch at offset: " << (result.first - n1) << endl;
  result = mismatch (n1, n1 + 5, n3);
  if (result.first == (n1 + 5) && result.second == (n3 + 5))
    cout << "n1 and n3 are the same" << endl;
  else
    cout << "Mismatch at offset: " << (result.first - n1) << endl;
  return 0;
}

rndshuf2.cpp

#include <stl.h>
#include 
#include 
class MyRandomGenerator
{
  public:
    unsigned long operator () (unsigned
        long n_);
};
unsigned long
MyRandomGenerator::operator () (unsigned
    long n_)
{
  return rand () % n_;
}
int main ()
{
  vector <int> v1(10);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  MyRandomGenerator r;
  for (int i = 0; i < 3; i++)
  {
    random_shuffle (v1.begin (), v1.end (), r);
    copy (v1.begin (), v1.end (), iter);
    cout << endl;
  }
  return 0;
}

merge2.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (5);
  vector <int> v2 (v1.size ());
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = 10 - i;
    v2[i] =  7 - i;
  }
  vector <int> result (v1.size () + v2.size ());
  merge (v1.begin (), v1.end (),
         v2.begin (), v2.end (),
         result.begin (),
         greater<int>() );
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  copy (result.begin (), result.end (), iter);
  cout << endl;
  return 0;
}

adjfind1.cpp

#include <stl.h>
#include 
int main ()
{
  typedef vector<int> IntVector;
  IntVector v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = i;
  IntVector::iterator location;
  location = adjacent_find (v.begin (), v.end ());
  if (location != v.end ())
    cout << "Found adjacent pair of: " << *location << endl;
  else
    cout << "No adjacent pairs" << endl;
  v[6] = 7;
  location = adjacent_find (v.begin (), v.end ());
  if (location != v.end ())
    cout << "Found adjacent pair of: " << *location << endl;
  else
    cout << "No adjacent pairs" << endl;
  return 0;
}

vec7.cpp

#include 
#include <stl.h>
int array1 [] = { 1, 4, 25 };
int array2 [] = { 9, 16 };
int main ()
{
  vector<int> v (array1, array1 + 3);
  v.insert (v.begin (), 0); // Insert
      before first element.
  v.insert (v.end (), 36); // Insert
      after last element.
  for (int i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  cout << endl;
  // Insert contents of array2 before fourth element.
  v.insert (v.begin () + 3, array2, array2 + 2);
  for (i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  cout << endl;
  return 0;
}

bcompos1.cpp

#include 
#include <stl.h>
struct odd : public unary_function<int, bool>
{
  odd () {}
  bool operator () (int n_) const { return (n_ % 2) == 1; }
};
struct positive : public unary_function<int, bool>
{
  positive () {}
  bool operator () (int n_) const { return n_ >= 0; }
};
int array [6] = { -2, -1, 0, 1, 2, 3 };
int main ()
{ 
  binary_compose<logical_and<bool>, odd, positive> 
    b (logical_and<bool> (), odd (), positive ());
  int* p = find_if (array, array + 6, b);
  if (p != array + 6)
    cout << *p << " is odd and positive" << endl;
  return 0;
}

setsymd2.cpp

#include <stl.h>
#include 
#include 
char* word1 = "ABCDEFGHIJKLMNO";
char* word2 = "LMNOPQRSTUVWXYZ";
int main ()
{
  ostream_iterator <char> iter (cout, "
      ");
  cout << "word1: ";
  copy (word1, word1 + ::strlen (word1), iter);
  cout << "\nword2: ";
  copy (word2, word2 + ::strlen (word2), iter);
  cout << endl;
  set_symmetric_difference (word1, word1 + ::strlen (word1),
                            word2, word2 + ::strlen (word2),
                            iter,
                            less<char>());
  cout << endl;
  return 0;
}

search0.cpp

#include <stl.h>
#include 
int v1[6] = { 1, 1, 2, 3, 5, 8 };
int v2[6] = { 0, 1, 2, 3, 4, 5 };
int v3[2] = { 3, 4 };
int main ()
{
  int* location;
  location = search (v1, v1 + 6, v3, v3 + 2);
  if (location == v1 + 6)
    cout << "v3 not contained in v1" << endl;
  else
    cout << "Found v3 in v1 at offset: " << location - v1 << endl;
  location = search (v2, v2 + 6, v3, v3 + 2);
  if (location == v2 + 6)
    cout << "v3 not contained in v2" << endl;
  else
    cout << "Found v3 in v2 at offset: " << location - v2 << endl;
  return 0;
}

eqlrnge1.cpp

#include <stl.h>
#include 
int main ()
{
  typedef vector <int> IntVec;
  IntVec v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = i / 3;
  ostream_iterator<int> iter (cout, "
      ");
  cout << "Within the collection:\n\t";
  copy (v.begin (), v.end (), iter);
  pair <IntVec::iterator, IntVec::iterator> range;
  range = equal_range (v.begin (), v.end (), 2);
  cout
    << "\n2 can be inserted from before index "
    << (range.first - v.begin ())
    << " to before index "
    << (range.second - v.begin ())
    << endl;
  return 0;
}

rotcopy1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  vector <int> v2 (v1.size ());
  for (int i = 0; i < v1.size (); i++)
  {
    rotate_copy (v1.begin (),
                 v1.begin () + i,
                 v1.end (),
                 v2.begin ());
    ostream_iterator <int> iter (cout, "
        ");
    copy (v2.begin (), v2.end (), iter);
    cout << endl;
  }
  cout << endl;
  return 0;
}

eqlrnge2.cpp

#include <stl.h>
#include 
#include 
char chars[] = "aabbccddggghhklllmqqqqssyyzz";
int main ()
{
  const unsigned count = sizeof (chars) - 1;
  ostream_iterator<char> iter (cout);
  cout << "Within the collection:\n\t";
  copy (chars, chars + count, iter);
  pair <char*, char*> range;
  range = equal_range (chars, chars + count, 'q', less<char>());
  cout
    << "\nq can be inserted from before index "
    << (range.first - chars)
    << " to before index "
    << (range.second - chars)
    << endl;
  return 0;
}

release1.cpp

#include <stl.h>
#include 
class X
{
  public:
    X (int i_) : i (i_) {}
    ~X () { cout << "Delete X(" << i << ")" << endl; }
    int i;
};
ostream& operator << (ostream& stream_, const X& x_)
{
  return stream_ << "X(" << x_.i << ")";
}
int main ()
{
  vector<X*> v;
  v.push_back (new X (2));
  v.push_back (new X (1));
  v.push_back (new X (4));
  vector<X*>::iterator i;
  for (i = v.begin (); i != v.end (); i++)
    cout << *(*i) << endl;
  release (v.begin (), v.end ()); // Delete heap-based objects.
  return 0;
}

incl1.cpp

#include <stl.h>
#include 
int main ()
{
  vector<int> v1(10);
  vector<int> v2(3);
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = i;
  }
  if (includes (v1.begin (), v1.end (), v2.begin (), v2.end ()))
    cout << "v1 includes v2" << endl;
  else
    cout << "v1 does not include v2" << endl;
  for (i = 0; i < v2.size (); i++)
    v2[i] = i + 3;
  if (includes (v1.begin (), v1.end (), v2.begin (), v2.end ()))
    cout << "v1 includes v2" << endl;
  else
    cout << "v1 does not include v2" << endl;
  return 0;
}

setintr2.cpp

#include <stl.h>
#include 
#include 
char* word1 = "ABCDEFGHIJKLMNO";
char* word2 = "LMNOPQRSTUVWXYZ";
int main ()
{
  ostream_iterator <char> iter (cout, "
      ");
  cout << "word1: ";
  copy (word1, word1 + ::strlen (word1), iter);
  cout << "\nword2: ";
  copy (word2, word2 + ::strlen (word2), iter);
  cout << endl;
  set_intersection (word1, word1 + ::strlen (word1),
                    word2, word2 + ::strlen (word2),
                    iter,
                    less<char>());
  cout << endl;
  return 0;
}

inrprod1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (3);
  vector <int> v2 (v1.size ());
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = i + 1;
    v2[i] = v1.size () - i;
  }
  ostream_iterator<int> iter (cout, "
      ");
  cout << "Inner product (sum of products) of:\n\t";
  copy (v1.begin (), v1.end (), iter);
  cout << "\n\t";
  copy (v2.begin (), v2.end (), iter);
  int result = inner_product (v1.begin (), v1.end (), v2.begin (), 0);
  cout << "\nis: " << result << endl;
  return 0;
}

merge1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (5);
  vector <int> v2 (v1.size ());
  iota (v1.begin (), v1.end (), 0);
  iota (v2.begin (), v2.end (), 3);
  vector <int> result (v1.size () + v2.size ());
  merge (v1.begin (), v1.end (), v2.begin (), v2.end (), result.begin ());
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  copy (result.begin (), result.end (), iter);
  cout << endl;
  return 0;
}

bcompos2.cpp

#include 
#include <stl.h>
struct odd : public unary_function<int, bool>
{
  odd () {}
  bool operator () (int n_) const { return (n_ % 2) == 1; }
};
struct positive : public unary_function<int, bool>
{
  positive () {}
  bool operator () (int n_) const { return n_ >= 0; }
};
int array [6] = { -2, -1 , 0, 1, 2, 3 };
int main ()
{
  int* p = find_if (array, array + 6, 
    compose2 (logical_and<bool> (), odd (), positive ()));
  if (p != array + 6)
    cout << *p << " is odd and positive" << endl;
  return 0;
}

error3.cpp

#include <stl.h>
// Compile this code without defining OS_USE_EXCEPTIONS.
void my_handler (int code_, const char* str_)
{
  cout << "Caught " << str_ << " code " << code_ << "" << endl;
}
int main ()
{
  os_handler_function_t old_h = os_set_error_handler (my_handler);
  vector<int> v;
  v.pop_back (); // Generates an empty object error.
  cout << "returned from pop_back()" << endl;
  os_set_error_handler (old_h);
  v.pop_back (); // Generates an empty object error.
  cout << "successful termination" << endl;
  return 0;
}

incl0.cpp

#include <stl.h>
#include 
int numbers1[5] = { 1, 2, 3, 4, 5 };
int numbers2[5] = { 1, 2, 4, 8, 16 };
int numbers3[2] = { 4, 8 };
int main ()
{
  if (includes (numbers1, numbers1 + 5, numbers3, numbers3 + 2))
    cout << "numbers1 includes numbers3" << endl;
  else
    cout << "numbers1 does not include numbers3" << endl;
  if (includes (numbers2, numbers2 + 5, numbers3, numbers3 + 2))
    cout << "numbers2 includes numbers3" << endl;
  else
    cout << "numbers2 does not include numbers3" << endl;
  return 0;
}

setdiff2.cpp

#include <stl.h>
#include 
#include 
char* word1 = "ABCDEFGHIJKLMNO";
char* word2 = "LMNOPQRSTUVWXYZ";
int main ()
{
  ostream_iterator <char> iter (cout, "
      ");
  cout << "word1: ";
  copy (word1, word1 + ::strlen (word1), iter);
  cout << "\nword2: ";
  copy (word2, word2 + ::strlen (word2), iter);
  cout << endl;
  set_difference (word1, word1 + ::strlen (word1),
                  word2, word2 + ::strlen (word2),
                  iter,
                  less<char>());
  cout << endl;
  return 0;
}

setunon2.cpp

#include <stl.h>
#include 
#include 
char* word1 = "ABCDEFGHIJKLMNO";
char* word2 = "LMNOPQRSTUVWXYZ";
int main ()
{
  ostream_iterator <char> iter (cout, "
      ");
  cout << "word1: ";
  copy (word1, word1 + ::strlen (word1), iter);
  cout << "\nword2: ";
  copy (word2, word2 + ::strlen (word2), iter);
  cout << endl;
  set_union (word1, word1 + ::strlen (word1),
             word2, word2 + ::strlen (word2),
             iter,
             less<char>());
  cout << endl;
  return 0;
}

unique2.cpp

#include <stl.h>
#include 
#include 
bool str_equal (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) == 0 ? 1 : 0;
}
char* labels[] = { "Q","Q","W","W","E","E","R","T","T","Y","Y" };
int main ()
{
  const unsigned count = sizeof (labels) / sizeof (labels[0]);
  ostream_iterator <char*> iter (cout);
  copy (labels, labels + count, iter);
  cout << endl;
  unique (labels, labels + count, str_equal);
  copy (labels, labels + count, iter);
  cout << endl;
  return 0;
}

parsrtc1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = rand () % 10;
  vector <int> result (5);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  partial_sort_copy (v1.begin (),
                     v1.end (),
                     result.begin (),
                     result.end ());
  copy (result.begin (), result.end (), iter);
  cout << endl;
  return 0;
}

equal1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = i;
  vector <int> v2 (10);
  if (equal (v1.begin (), v1.end (), v2.begin ()))
    cout << "v1 is equal to v2" << endl;
  else
    cout << "v1 is not equal to v2" << endl;
  copy (v1.begin (), v1.end (), v2.begin ());
  if (equal (v1.begin (), v1.end (), v2.begin ()))
    cout << "v1 is equal to v2" << endl;
  else
    cout << "v1 is not equal to v2" << endl;
  return 0;
}

equal0.cpp

#include <stl.h>
#include 
int numbers1[5] = { 1, 2, 3, 4, 5 };
int numbers2[5] = { 1, 2, 4, 8, 16 };
int numbers3[2] = { 1, 2 };
int main ()
{
  if (equal (numbers1, numbers1 + 5, numbers2))
    cout << "numbers1 is equal to numbers2" << endl;
  else
    cout << "numbers1 is not equal to numbers2" << endl;
  if (equal (numbers3, numbers3 + 2, numbers1))
    cout << "numbers3 is equal to numbers1" << endl;
  else
    cout << "numbers3 is not equal to numbers1" << endl;
  return 0;
}

genern2.cpp

#include <stl.h>
#include 
#include 
class Fibonacci
{
  public:
    Fibonacci () : v1 (0), v2 (1) {}
    int operator () ();
  private:
    int v1;
    int v2;
};
int
Fibonacci::operator () ()
{
  int r = v1 + v2;
  v1 = v2;
  v2 = r;
  return v1;
}
int main ()
{
  vector <int> v1 (10);
  Fibonacci generator;
  generate_n (v1.begin (), v1.size (), generator);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

gener2.cpp

#include <stl.h>
#include 
#include 
class Fibonacci
{
  public:
    Fibonacci () : v1 (0), v2 (1) {}
    int operator () ();
  private:
    int v1;
    int v2;
};
int
Fibonacci::operator () ()
{
  int r = v1 + v2;
  v1 = v2;
  v2 = r;
  return v1;
}
int main ()
{
  vector <int> v1 (10);
  Fibonacci generator;
  generate (v1.begin (), v1.end (), generator);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

repcpif1.cpp

#include <stl.h>
#include 
bool odd (int a_)
{
  return a_ % 2;
}
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = i % 5;
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  vector <int> v2 (v1.size ());
  replace_copy_if (v1.begin (), v1.end (), v2.begin (), odd, 42);
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

setsymd.cpp

deque1.cpp

#include 
#include <stl.h>
int main ()
{
  deque<int> d;
  d.push_back (4); // Add after end.
  d.push_back (9);
  d.push_back (16);
  d.push_front (1); // Insert at beginning.
  for (int i = 0; i < d.size (); i++)
    cout << "d[" << i << "]
        = " << d[i] << endl;
  cout << endl;
  d.pop_front (); // Erase first element.
  d[2] = 25; //
      Replace last element.
  for (i = 0; i < d.size (); i++)
    cout << "d[" << i << "]
        = " << d[i] << endl;
  return 0;
}

findif1.cpp

#include <stl.h>
#include 
bool div_3 (int a_)
{
  return a_ % 3 ? 0 : 1;
}
int main ()
{
  typedef vector <int> IntVec;
  IntVec v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = (i + 1) * (i + 1);
  IntVec::iterator iter;
  iter = find_if (v.begin (), v.end (), div_3);
  if (iter != v.end ())
    cout
      << "Value "
      << *iter
      << " at offset "
      << (iter - v.begin ())
      << " is divisible by 3"
      << endl;
  return 0;
}

ucompos1.cpp

#include 
#include <math.h>
#include <stl.h>
struct square_root : public unary_function<double, double>
{
  square_root () {}
  double operator () (double x_) const { return sqrt (x_); }
};
int input [3] = { -1, -4, -16 };
int main ()
{ 
  int output [3];
  transform (input, input + 3, output, 
    unary_compose<square_root, negate<int> > (square_root (), negate<int> ()));
  for (int i = 0; i < 3; i++)
    cout << output[i] << endl;
  return 0;
}

rawiter.cpp

#include 
#include <stl.h>
class X
{
  public:
    X (int i_ = 0) : i (i_) {}
    operator int () const { return i; }
  private:
    int i;
};
int main ()
{
  os_heap_allocator<X> a;
  // Allocate (but do not construct) storage for 5 elements.
  os_heap_allocator<X>::pointer p = a.allocate (5); 
  raw_storage_iterator<X*, X> r (p);
  for (int i = 0; i < 5; i++)
    *r++ = X (i);
  for (i = 0; i < 5; i++)
    cout << *p++ << endl;
  return 0;
}

set2.cpp

#include 
#include <stl.h>
int main ()
{
  set<int, less<int> > s;
  pair<set<int, less<int> >::const_iterator, bool> p;
  p = s.insert (42);
  if (p.second)
   cout << "Inserted new element " << *(p.first) << endl;
  else
   cout << "Existing element = " << *(p.first) << endl;
  p = s.insert (42);
  if (p.second)
   cout << "Inserted new element " << *(p.first) << endl;
  else
   cout << "Existing element = " << *(p.first) << endl;
  return 0;
}

mset3.cpp

#include 
#include <stl.h>
int array [] = { 3, 6, 1, 2, 3, 2, 6, 7, 9 };
int main ()
{
  multiset<int, less<int> > s (array, array + 9);
  multiset<int, less<int> >::iterator i;
  // Return location of first element that is not less than 3
  i = s.lower_bound (3);
  cout << "lower bound = " << *i << endl;
  // Return location of first element that is greater than 3
  i = s.upper_bound (3);
  cout << "upper bound = " << *i << endl;
  return 0;
}

binsrch2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* labels[] = { "aa", "dd", "ff", "jj", "ss", "zz" };
int main ()
{
  const unsigned count = sizeof (labels) / sizeof (labels[0]);
  if (binary_search (labels, labels + count, "ff", str_compare))
    cout << "ff is in labels." << endl;
  else
    cout << "ff is not in labels." << endl;
  return 0;
}

nthelem2.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = rand () % 10;
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  nth_element (v1.begin (),
               v1.begin () + v1.size () / 2,
               v1.end (),
               greater<int>());
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

setintr1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  iota (v1.begin (), v1.end (), 0);
  vector <int> v2 (10);
  iota (v2.begin(), v2.end (), 7);
  ostream_iterator <int> iter (cout, "
      ");
  cout << "v1: ";
  copy (v1.begin (), v1.end (), iter);
  cout << "\nv2: ";
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  set_intersection (v1.begin (), v1.end (), v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

setdiff1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  iota (v1.begin (), v1.end (), 0);
  vector <int> v2 (10);
  iota (v2.begin(), v2.end (), 7);
  ostream_iterator <int> iter (cout, "
      ");
  cout << "v1: ";
  copy (v1.begin (), v1.end (), iter);
  cout << "\nv2: ";
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  set_difference (v1.begin (), v1.end (), v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

adjdiff2.cpp

#include <stl.h>
#include 
int mult (int a_, int b_)
{
  return a_ * b_;
}
int main ()
{
  vector <int> v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = i + 1;
  vector <int> rslt (v.size ());
  adjacent_difference (v.begin (), v.end (), rslt.begin (), mult);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v.begin (), v.end (), iter);
  cout << endl;
  copy (rslt.begin (), rslt.end (), iter);
  cout << endl;
  return 0;
}

rotate1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  for (int i = 0; i < v1.size (); i++)
  {
    rotate (v1.begin (), v1.begin () + i, v1.end ());
    ostream_iterator <int> iter (cout, "
        ");
    copy (v1.begin (), v1.end (), iter);
    cout << endl;
  }
  cout << endl;
  return 0;
}

setunon1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  iota (v1.begin (), v1.end (), 0);
  vector <int> v2 (10);
  iota (v2.begin(), v2.end (), 7);
  ostream_iterator <int> iter (cout, "
      ");
  cout << "v1: ";
  copy (v1.begin (), v1.end (), iter);
  cout << "\nv2: ";
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  set_union (v1.begin (), v1.end (), v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

insert1.cpp

#include 
#include <stl.h>
char* array1 [] = { "laurie", "jennifer", "leisa" };
char* array2 [] = { "amanda", "saskia", "carrie" };
int main ()
{
  deque<char*> names (array1, array1 + 3);
  deque<char*>::iterator i = names.begin () + 2;
  copy (array2, array2 + 3, insert_iterator<deque <char*> > (names, i));
  deque<char*>::iterator j;
  for (j = names.begin (); j != names.end (); j++)
    cout << *j << endl;
  return 0;
}

ucompos2.cpp

#include 
#include <math.h>
#include <stl.h>
struct square_root : public unary_function<double, double>
{
  square_root () {}
  double operator () (double x_) const { return sqrt (x_); }
};
int input [3] = { -1, -4, -16 };
int main ()
{ 
  int output [3];
  transform (input, input + 3, output, 
    compose1 (square_root (), negate<int> ()));
  for (int i = 0; i < 3; i++)
   cout << output[i] << endl;
  return 0;
}

parsrt1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = rand () % 10;
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  partial_sort (v1.begin (),
                v1.begin () + v1.size () / 2,
                v1.end ());
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

equal2.cpp

#include <stl.h>
#include 
bool values_squared (int a_, int b_)
{
  return (a_ * a_ == b_);
}
int main ()
{
  vector <int> v1 (10);
  vector <int> v2 (10);
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = i;
    v2[i] = i * i;
  }
  if (equal (v1.begin (), v1.end (), v2.begin (), values_squared))
    cout << "v2[i] == v1[i] * v1[i]" << endl;
  else
    cout << "v2[i] != v1[i] * v1[i]" << endl;
  return 0;
}

inplmrg2.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1(10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = (v1.size () - i - 1) % 5;
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  inplace_merge (v1.begin (), v1.begin () + 5,
                 v1.end (),
                 greater<int>());
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

nthelem1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = rand () % 10;
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  nth_element (v1.begin (),
               v1.begin () + v1.size () / 2,
               v1.end ());
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

vec4.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int> v (4);
  v[0] = 1;
  v[1] = 4;
  v[2] = 9;
  v[3] = 16;
  cout << "front = " << v.front () << endl;
  cout << "back = " << v.back () << ", size = " << v.size () << endl;
  v.push_back (25);
  cout << "back = " << v.back () << ", size = " << v.size () << endl;
  v.pop_back ();
  cout << "back = " << v.back () << ", size = " << v.size () << endl;
  return 0;
}

lwrbnd2.cpp

#include <stl.h>
#include 
#include 
bool char_str_less (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* str [] = { "a", "a", "b", "b", "q", "w", "z" };
int main ()
{
  const unsigned strCt = sizeof (str)/sizeof (str[0]);
  cout
    << "d can be inserted at index: "
    << (lower_bound (str,  str + strCt, "d", char_str_less) - str)
    << endl;
  return 0;
}

pheap2.cpp

#include <stl.h>
#include 
int main ()
{
  vector<int> v;
  v.push_back (1);
  v.push_back (20);
  v.push_back (4);
  make_heap (v.begin (), v.end (), greater<int> ());
  v.push_back (7);
  push_heap (v.begin (), v.end (), greater<int> ());
  sort_heap (v.begin (), v.end (), greater<int> ());
  ostream_iterator<int> iter (cout, "
      ");
  copy (v.begin (), v.end (), iter);
  cout << endl;
  return 0;
}

insert2.cpp

#include 
#include <stl.h>
char* array1 [] = { "laurie", "jennifer", "leisa" };
char* array2 [] = { "amanda", "saskia", "carrie" };
int main ()
{
  deque<char*> names (array1, array1 + 3);
  deque<char*>::iterator i = names.begin () + 2;
  copy (array2, array2 + 3, inserter (names, i));
  deque<char*>::iterator j;
  for (j = names.begin (); j != names.end (); j++)
    cout << *j << endl;
  return 0;
}

uprbnd2.cpp

#include <stl.h>
#include 
#include 
bool char_str_less (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* str [] = { "a", "a", "b", "b", "q", "w", "z" };
int main ()
{
  const unsigned strCt = sizeof (str)/sizeof (str[0]);
  cout
    << "d can be inserted at index: "
    << upper_bound (str,  str + strCt, "d", char_str_less) - str
    << endl;
  return 0;
}

vec3.cpp

#include 
#include <stl.h>
int main ()
{
  vector<char> v1; // Empty vector
      of characters.
  v1.push_back ('h');
  v1.push_back ('i');
  cout << "v1 = " << v1[0] << v1[1] << endl;
  vector<char> v2 (v1);
  v2[1] = 'o'; //
      Replace second character.
  cout << "v2 = " << v2[0] << v2[1] << endl;
  cout << "(v1 == v2) = " << (v1 == v2) << endl;
  cout << "(v1 < v2) = " << (v1 < v2) << endl;
  return 0;
}

iter4.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int> v; // Empty vector
      of integers.
  v.push_back (1);
  v.push_back (2);
  v.push_back (3);
  // Position immediately after last item.
  vector<int>::iterator i = v.end (); 
  // Move back one and then access.
  cout << "last element is " << *--i << endl; 
  i -= 2; // Jump back two items.
  cout << "first element is " << *i << endl;
  return 0;
}

setdiff0.cpp

#include <stl.h>
#include 
int v1[3] = { 13, 18, 23 };
int v2[4] = { 10, 13, 17, 23 };
int result[4] = { 0, 0, 0, 0 };
int main ()
{
  set_difference (v1, v1 + 3, v2, v2 + 4, result);
  for (int i = 0; i < 4; i++)
    cout << result[i] << ' ';
  cout << endl;
  set_difference (v2, v2 + 4, v1, v1 + 2, result);
  for (i = 0; i < 4; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

lexcmp2.cpp

#include <stl.h>
#include 
const unsigned size = 6;
char n1[size] = "shoe";
char n2[size] = "shine";
int main ()
{
  bool before =
    lexicographical_compare (n1, n1 + size,
                             n2, n2 + size,
                             greater<char>());
  if (before)
    cout << n1 << " is after " << n2 << endl;
  else
    cout << n2 << " is after " << n1 << endl;
  return 0;
}

adjdiff1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = i * i;
  vector <int> result (v.size ());
  adjacent_difference (v.begin (), v.end (), result.begin ());
  ostream_iterator<int> iter (cout, "
      ");
  copy (v.begin (), v.end (), iter);
  cout << endl;
  copy (result.begin (), result.end (), iter);
  cout << endl;
  return 0;
}

stblptn1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = rand () % 20;
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  stable_partition (v1.begin (), v1.end (), bind2nd(less<int>(), 11));
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

ptition1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = rand () % 20;
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  partition (v1.begin (), v1.end (), bind2nd(less<int>(), 11));
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

vec1.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int> v1; // Empty vector
      of integers.
  cout << "empty = " << v1.empty () << endl;
  cout << "size = " << v1.size () << endl;
  cout << "max_size = " << v1.max_size () << endl;
  v1.push_back (42); // Add an integer
      to the vector.
  cout << "size = " << v1.size () << endl;
  cout << "v1[0] = " << v1[0] << endl;
  return 0;
}

sort2.cpp

#include <stl.h>
#include 
int array[] = { 1, 50, -10, 11, 42, 19 };
int main ()
{
  int count = sizeof (array) / sizeof (array[0]);
  ostream_iterator <int> iter (cout, "
      ");
  cout << "before: ";
  copy (array, array + count, iter);
  cout << "\nafter: ";
  sort (array, array + count, greater<int>());
  copy (array, array + count, iter);
  cout << endl;
  return 0;
}

copy4.cpp

#include <stl.h>
#include 
int main ()
{
  typedef vector<int> IVec;
  vector<int> v1 (10);
  for (int loc = 0; loc < v1.size (); loc++)
    v1[loc] = loc;
  vector<int> v2;
  insert_iterator<IVec> i (v2, v2.begin ());
  copy (v1.begin (), v1.end (), i);
  ostream_iterator<int> outIter (cout, "
      ");
  copy (v2.begin (), v2.end (), outIter);
  cout << endl;
  return 0;
}

prevprm2.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (3);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  for (int i = 0; i < 9; i++)
  {
    prev_permutation (v1.begin (), v1.end (), greater<int>());
    copy (v1.begin (), v1.end (), iter);
    cout << endl;
  }
  return 0;
}

trnsfrm2.cpp

#include <stl.h>
#include 
#include 
char map_char (char a_, int b_)
{
  return char(a_ + b_);
}
int trans[] = {-4, 4, -6, -6, -10, 0, 10, -6, 6, 0, -1, -77};
char n[] = "Larry Mullen";
int main ()
{
  const unsigned count = ::strlen (n);
  ostream_iterator <char> iter (cout);
  transform (n, n + count, trans, iter, map_char);
  cout << endl;
  return 0;
}

iter1.cpp

#include 
#include <stl.h>
int main ()
{
  vector<const char*> v; // Vector
      of character strings.
  v.push_back ((char*) "zippy"); // First element.
  v.push_back ((char*) "motorboy"); // Second element.
  vector<const char*>::iterator i = v.begin (); // Position at end.
  for (i = v.begin (); i != v.end (); i++)
    cout << *i << endl; // Display item.
  return 0;
}

nextprm2.cpp

maxelem2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* names[] = { "Brett", "Graham", "Jack", "Mike", "Todd" };
int main ()
{
  const unsigned namesCt = sizeof (names)/sizeof (names[0]);
  cout << *max_element (names, names + namesCt, str_compare) << endl;
  return 0;
}

minelem2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* names[] = { "Brett", "Graham", "Jack", "Mike", "Todd" };
int main ()
{
  const unsigned namesCt = sizeof (names)/sizeof (names[0]);
  cout << *min_element (names, names + namesCt, str_compare) << endl;
  return 0;
}

partsum2.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (5);
  iota (v1.begin (), v1.end (), 1);
  vector <int> v2 (v1.size());
  partial_sum (v1.begin (), v1.end (), v2.begin (), times<int>());
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

istmit1.cpp

#include 
#include <stl.h>
int main ()
{
  char buffer [100];
  int i = 0;
  cin.unsetf (ios::skipws); // Disable white-space skipping.
  cout << "Please enter a string: ";
  istream_iterator s (cin);
  while (*s != '\n')
    buffer[i++] = *s++;
  buffer[i] = '&#92;&#48;'; // Null terminate
      buffer.
  cout << "read " << buffer << endl;
  return 0;
}

findif0.cpp

#include <stl.h>
#include 
bool odd (int a_)
{
  return a_ % 2;
}
int numbers[6] = { 2, 4, 8, 15, 32, 64 };
int main ()
{
  int* location = find_if (numbers, numbers + 6, odd);
  if (location != numbers + 6)
    cout
      << "Value "
      << *location
      << " at offset "
      << (location - numbers)
      << " is odd"
      << endl;
  return 0;
}

pheap1.cpp

#include <stl.h>
#include 
int main ()
{
  vector<int> v;
  v.push_back (1);
  v.push_back (20);
  v.push_back (4);
  make_heap (v.begin (), v.end ());
  v.push_back (7);
  push_heap (v.begin (), v.end ());
  sort_heap (v.begin (), v.end ());
  ostream_iterator<int> iter (cout, "
      ");
  copy (v.begin (), v.end (), iter);
  cout << endl;
  return 0;
}

stblsrt2.cpp

#include <stl.h>
#include 
#include 
bool string_less(const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
char* letters[6] = {"bb", "aa", "ll", "dd", "qq", "cc" };
int main ()
{
  stable_sort (letters, letters + 6, string_less);
  for (int i = 0; i < 6; i++)
    cout << letters[i] << ' ';
  cout << endl;
  return 0;
}

nextprm1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (3);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  for (int i = 0; i < 9; i++)
  {
    next_permutation (v1.begin (), v1.end ());
    copy (v1.begin (), v1.end (), iter);
    cout << endl;
  }
  return 0;
}

prevprm1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (3);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator<int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  for (int i = 0; i < 9; i++)
  {
    prev_permutation (v1.begin (), v1.end ());
    copy (v1.begin (), v1.end (), iter);
    cout << endl;
  }
  return 0;
}

rndshuf1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1(10);
  iota (v1.begin (), v1.end (), 0);
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  for (int i = 0; i < 3; i++)
  {
    random_shuffle (v1.begin (), v1.end ());
    copy (v1.begin (), v1.end (), iter);
    cout << endl;
  }
  return 0;
}

ptrbinf1.cpp

#include 
#include <stl.h>
int sum (int x_, int y_)
{
  return x_ + y_;
}
int input1 [4] = { 7, 2, 3, 5 };
int input2 [4] = { 1, 5, 5, 8 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, 
    pointer_to_binary_function<int, int, int> (sum));
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

iter2.cpp

#include 
#include <stl.h>
void print (const vector<const char*>& v_)
{
  vector<const char*>::const_iterator i;
  for (i = v_.begin (); i != v_.end (); i++)
    cout << *i << endl;
}
int main ()
{
  vector<const char*> v; // Vector
      of character strings.
  v.push_back ((char*) "zippy");
  v.push_back ((char*) "motorboy");
  print (v);
  return 0;
}

partsum1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  iota (v1.begin (), v1.end (), 0);
  vector <int> v2 (v1.size());
  partial_sum (v1.begin (), v1.end (), v2.begin ());
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

replif1.cpp

#include <stl.h>
#include 
bool odd (int a_)
{
  return a_ % 2;
}
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = i % 5;
    cout << v1[i] << ' ';
  }
  cout << endl;
  replace_if (v1.begin (), v1.end (), odd, 42);
  for (i = 0; i < v1.size (); i++)
    cout << v1[i] << ' ';
  cout << endl;
  return 0;
}

mset4.cpp

#include 
#include <stl.h>
int array [] = { 3, 6, 1, 2, 3, 2, 6, 7, 9 };
int main ()
{
  typedef multiset<int, less<int> > mset;
  mset s (array, array + 9);
  pair<mset::const_iterator, mset::const_iterator> p = s.equal_range (3);
  cout << "lower bound = " << *(p.first) << endl;
  cout << "upper bound = " << *(p.second) << endl;
  return 0;
}

iter3.cpp

#include 
#include <stl.h>
int main ()
{
  vector<const char*> v; // Vector
      of character strings.
  v.push_back ((char*) "zippy"); // First element.
  v.push_back ((char*) "motorboy"); // Second element.
  vector<const char*>::reverse_iterator i;
  for (i = v.rbegin (); i != v.rend (); i++)
    cout << *i << endl; // Display item.
  return 0;
}

list2.cpp

#include 
#include <stl.h>
int array1 [] = { 1, 16 };
int array2 [] = { 4, 9 };
int main ()
{
  list<int> l1 (array1, array1 + 2);
  list<int> l2 (array2, array2 + 2);
  list<int>::iterator i = l1.begin ();
  i++;
  l1.splice (i, l2, l2.begin (), l2.end ());
  i = l1.begin ();
  while (i != l1.end ())
    cout << *i++ << endl;
  return 0;
}

set1.cpp

#include 
#include <stl.h>
int main ()
{
  set<int, less<int> > s;
  cout << "count (42) = " << s.count (42) << endl;
  s.insert (42);
  cout << "count (42) = " << s.count (42) << endl;
  s.insert (42);
  cout << "count (42) = " << s.count (42) << endl;
  int count = s.erase (42);
  cout << count << " elements erased" << endl;
  return 0;
}

list1.cpp

#include 
#include <stl.h>
int array1 [] = { 9, 16, 36 };
int array2 [] = { 1, 4 };
int main ()
{
  list<int> l1 (array1, array1 + 3);
  list<int> l2 (array2, array2 + 2);
  list<int>::iterator i1 = l1.begin ();
  l1.splice (i1, l2);
  list<int>::iterator i2 = l1.begin ();
  while (i2 != l1.end ())
    cout << *i2++ << endl;
  return 0;
}

alg5.cpp

#include 
#include <stl.h>
int main ()
{
  list<int> years;
  years.push_back (1962);
  years.push_back (1992);
  years.push_back (2001);
  years.push_back (1999);
  sort (years.begin (), years.end ()); // Causes linker error.
  list<int>::iterator i;
  for (i = years.begin (); i != years.end (); i++)
    cout << *i << endl;
  return 0;
}

eqlrnge0.cpp

#include <stl.h>
#include 
int numbers[10] = { 0, 0, 1, 1, 2, 2, 2, 2, 3, 3 };
int main ()
{
  pair <int*, int*> range;
  range = equal_range (numbers, numbers + 10, 2);
  cout
    << "2 can be inserted from before index "
    << (range.first - numbers)
    << " to before index "
    << (range.second - numbers)
    << endl;
  return 0;
}

advance.cpp

#include <stl.h>
#include 
int main ()
{
  typedef vector <int> IntVector;
  IntVector v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = i;
  IntVector::iterator location = v.begin ();
  cout << "At Beginning: " << *location << endl;
  advance (location, 5);
  cout << "At Beginning + 5: " << *location << endl;
  return 0;
}

replace1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = i % 5;
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  replace (v1.begin (), v1.end (), 2, 42);
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

alg3.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int> i;
  i.push_back (1);
  i.push_back (4);
  i.push_back (2);
  i.push_back (8);
  i.push_back (2);
  i.push_back (2);
  int n = 0; //
      Must be initialized, as count increments n.
  count (i.begin (), i.end (), 2, n);
  cout << "Count of 2s = " << n << endl;
  return 0;
}

func2.cpp

#include 
#include <stl.h>
bool bigger_than (int x_, int y_)
{
  return x_ > y_;
}
int main ()
{
  vector<int>v;
  v.push_back (4);
  v.push_back (1);
  v.push_back (5);
  sort (v.begin (), v.end (), bigger_than);
  vector<int>::iterator i;
  for (i = v.begin (); i != v.end (); i++)
    cout << *i << endl;
  return 0;
}

unegate1.cpp

#include 
#include <stl.h>
struct odd : public unary_function<int, bool>
{
  odd () {}
  bool operator () (int n_) const { return (n_ % 2) == 1; }
};
int array [3] = { 1, 2, 3 };
int main ()
{
  int* p = find_if (array, array + 3, unary_negate<odd> (odd ()));
  if (p != array + 3)
    cout << *p << endl;
  return 0;
}

alg4.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int> years;
  years.push_back (1962);
  years.push_back (1992);
  years.push_back (2001);
  years.push_back (1999);
  sort (years.begin (), years.end ());
  vector<int>::iterator i;
  for (i = years.begin (); i != years.end (); i++)
    cout << *i << endl;
  return 0;
}

countif1.cpp

#include <stl.h>
#include 
int odd (int a_)
{
  return a_ % 2;
}
int main ()
{
  vector <int> numbers(100);
  for (int i = 0; i < 100; i++)
    numbers[i] = i % 3;
  int elements = 0;
  count_if (numbers.begin (), numbers.end (), odd, elements);
  cout << "Found " << elements << " odd elements." << endl;
  return 0;
}

lwrbnd1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (20);
  for (int i = 0; i < v1.size (); i++)
  {
    v1[i] = i/4;
    cout << v1[i] << ' ';
  }
  int* location =  lower_bound (v1.begin (), v1.end (), 3);
  cout
    << "\n3 can be inserted at index: "
    << (location - v1.begin ())
    << endl;
  return 0;
}

lexcmp1.cpp

#include <stl.h>
#include 
const unsigned size = 6;
char n1[size] = "shoe";
char n2[size] = "shine";
int main ()
{
  bool before = lexicographical_compare (n1, n1 + size, n2, n2 + size);
  if (before)
    cout << n1 << " is before " << n2 << endl;
  else
    cout << n2 << " is before " << n1 << endl;
  return 0;
}

copyb.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = i;
  vector <int> v2(v1.size ());
  copy_backward (v1.begin (), v1.end (), v2.end ());
  ostream_iterator<int> iter (cout, "
      ");
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

ptrbinf2.cpp

#include 
#include <stl.h>
int sum (int x_, int y_)
{
  return x_ + y_;
}
int input1 [4] = { 7, 2, 3, 5 };
int input2 [4] = { 1, 5, 5, 8 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, ptr_fun (sum));
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

copyb0.cpp

#include <stl.h>
#include 
int numbers[5] = { 1, 2, 3, 4, 5 };
int main ()
{
  int result[5];
  copy_backward (numbers, numbers + 5, result + 5);
  for (int i = 0; i < 5; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  for (i = 0; i < 5; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

binsert1.cpp

#include 
#include <stl.h>
char* array [] = { "laurie", "jennifer", "leisa" };
int main ()
{
  vector<char*> names;
  copy (array, array + 3, back_insert_iterator<vector <char*> > (names));
  vector<char*>::iterator i;
  for (i = names.begin (); i != names.end (); i++)
    cout << *i << endl;
  return 0;
}

unegate2.cpp

#include 
#include <stl.h>
struct odd : public unary_function<int, bool>
{
  odd () {}
  bool operator () (int n_) const { return (n_ % 2) == 1; }
};
int array [3] = { 1, 2, 3 };
int main ()
{
  int* p = find_if (array, array + 3, not1 (odd ()));
  if (p != array + 3)
    cout << *p << endl;
  return 0;
}

revcopy1.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 3, 4, 5 };
int main ()
{
  int result[6];
  reverse_copy (numbers, numbers + 6, result);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  for (i = 0; i < 6; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

finsert1.cpp

#include 
#include <stl.h>
char* array [] = { "laurie", "jennifer", "leisa" };
int main ()
{
  deque<char*> names;
  copy (array, array + 3, front_insert_iterator<deque <char*> > (names));
  deque<char*>::iterator i;
  for (i = names.begin (); i != names.end (); i++)
    cout << *i << endl;
  return 0;
}

remcpif1.cpp

#include <stl.h>
#include 
bool odd (int a_)
{
  return a_ % 2;
}
int numbers[6] = { 1, 2, 3, 1, 2, 3 };
int result[6] = { 0, 0, 0, 0, 0, 0 };
int main ()
{
  remove_copy_if (numbers, numbers + 6, result, odd);
  for (int i = 0; i < 6; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

inplmrg1.cpp

#include <stl.h>
#include 
int numbers[6] = { 1, 10, 42, 3, 16, 32 };
int main ()
{
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  inplace_merge (numbers, numbers + 3, numbers + 6);
  for (i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

list4.cpp

#include 
#include <stl.h>
int array1 [] = { 1, 3, 6, 7 };
int array2 [] = { 2, 4 };
int main ()
{
  list<int> l1 (array1, array1 + 4);
  list<int> l2 (array2, array2 + 2);
  l1.merge (l2);
  for (list<int>::iterator i = l1.begin (); i != l1.end (); i++)
    cout << *i;
  cout << endl;
  return 0;
}

revbit1.cpp

#include 
#include <stl.h>
int array [] = { 1, 5, 2, 3 };
int main ()
{
  list<int> v (array, array + 4);
  reverse_bidirectional_iterator<list<int>::iterator, int, 
    list<int>::reference, list<int>::difference_type> r (v.end ());
  while (r != v.begin ())
    cout << *r++ << endl;
  return 0;
}

copy3.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = i;
  vector <int> v2 (10);
  copy (v1.begin (), v1.end (), v2.begin ());
  ostream_iterator<int> iter (cout, "
      ");
  copy (v2.begin (), v2.end (), iter);
  cout << endl;
  return 0;
}

merge0.cpp

#include <stl.h>
#include 
int numbers1[5] = { 1, 6, 13, 25, 101 };
int numbers2[5] = {-5, 26, 36, 46, 99 };
int main ()
{
  int result[10];
  merge (numbers1, numbers1 + 5, numbers2, numbers2 + 5, result);
  for (int i = 0; i < 10; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

reviter1.cpp

#include 
#include <stl.h>
int array [] = { 1, 5, 2, 3 };
int main ()
{
  vector<int> v (array, array + 4);
  stl_reverse_iterator<vector<int>::iterator, int, 
    vector<int>::reference, vector<int>::difference_type> r (v.end ());
  while (r != v.begin ())
    cout << *r++ << endl;
  return 0;
}

find1.cpp

#include <stl.h>
#include 
int years[] = { 1942, 1952, 1962, 1972, 1982, 1992 };
int main ()
{
  const unsigned yearCount = sizeof (years) / sizeof (years[0]);
  int* location = find (years, years + yearCount, 1972);
  cout << "Found 1972 at offset " << (location - years) << endl;
  return 0;
}

trnsfrm1.cpp

#include <stl.h>
#include 
int negate_int (int a_)
{
  return -a_;
}
int numbers[6] = { -5, -1, 0, 1, 6, 11 };
int main ()
{
  int result[6];
  transform (numbers, numbers + 6, result, negate_int);
  for (int i = 0; i < 6; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

binsert2.cpp

#include 
#include <stl.h>
char* array [] = { "laurie", "jennifer", "leisa" };
int main ()
{
  vector<char*> names;
  copy (array, array + 3, back_inserter (names));
  vector<char*>::iterator i;
  for (i = names.begin (); i != names.end (); i++)
    cout << *i << endl;
  return 0;
}

setsymd0.cpp

#include <stl.h>
#include 
int v1[3] = { 13, 18, 23 };
int v2[4] = { 10, 13, 17, 23 };
int result[4] = { 0, 0, 0, 0 };
int main ()
{
  set_symmetric_difference (v1, v1 + 3, v2, v2 + 4, result);
  for (int i = 0; i < 4; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

finsert2.cpp

#include 
#include <stl.h>
char* array [] = { "laurie", "jennifer", "leisa" };
int main ()
{
  deque<char*> names;
  copy (array, array + 3, front_inserter (names));
  deque<char*>::iterator i;
  for (i = names.begin (); i != names.end (); i++)
    cout << *i << endl;
  return 0;
}

mset2.cpp

#include 
#include <stl.h>
char* names [] = { "dave", "alf", "chas", "bob", "ed", "chas" };
int main ()
{
  typedef multiset<char*, less_s> mset;
  mset s;
  s.insert (names, names + 6);
  for (mset::iterator i = s.begin (); i != s.end (); i++)
    cout << *i << endl;
  return 0;
}

ostmit.cpp

#include 
#include <stl.h>
int array [] = { 1, 5, 2, 4 };
int main ()
{
  char* string = "hello";
  ostream_iterator<char> it1 (cout);
  copy (string, string + 5, it1);
  cout << endl;
  ostream_iterator<int> it2 (cout);
  copy (array, array + 4, it2);
  cout << endl;
  return 0;
}

ptrunf1.cpp

#include 
#include <stl.h>
bool even (int n_)
{
  return (n_ % 2) == 0;
}
int array [3] = { 1, 2, 3 };
int main ()
{
  int* p = find_if (array, array + 3, 
    pointer_to_unary_function<int, bool> (even));
  if (p != array + 3)
    cout << *p << " is even" << endl;
  return 0;
}

func1.cpp

#include 
#include <stl.h>
bool bigger (int i_)
{
  return i_ > 3;
}
int main ()
{
  vector<int>v;
  v.push_back (4);
  v.push_back (1);
  v.push_back (5);
  int n = 0;
  count_if (v.begin (), v.end (), bigger, n);
  cout << "Number greater than 3 = " << n << endl;
  return 0;
}

stblptn0.cpp

#include <stl.h>
#include 
bool less_10 (int a_)
{
  return a_ < 10 ? 1 : 0;
}
int numbers[6] = { 10, 5, 11, 20, 6, -2 };
int main ()
{
  stable_partition (numbers, numbers + 6, less_10);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

setunon0.cpp

#include <stl.h>
#include 
int v1[3] = { 13, 18, 23 };
int v2[4] = { 10, 13, 17, 23 };
int result[7] = { 0, 0, 0, 0, 0, 0, 0 };
int main ()
{
  set_union (v1, v1 + 3, v2, v2 + 4, result);
  for (int i = 0; i < 7; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

mkheap1.cpp

#include <stl.h>
#include 
int numbers[6] = { 5, 10, 4, 13, 11, 19 };
int main ()
{
  make_heap (numbers, numbers + 6, greater<int> ());
  for (int i = 6; i >= 1; i--)
  {
    cout << numbers[0] << endl;
    pop_heap (numbers, numbers + i, greater<int> ());
  }
  return 0;
}

setintr0.cpp

#include <stl.h>
#include 
int v1[3] = { 13, 18, 23 };
int v2[4] = { 10, 13, 17, 23 };
int result[4] = { 0, 0, 0, 0 };
int main ()
{
  set_intersection (v1, v1 + 3, v2, v2 + 4, result);
  for (int i = 0; i < 4; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

logicand.cpp

#include 
#include <stl.h>
bool input1 [4] = { 1, 1, 0, 1 };
bool input2 [4] = { 0, 1, 0, 0 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, logical_and<bool> ());
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

logicor.cpp

#include 
#include <stl.h>
bool input1 [4] = { 1, 1, 0, 1 };
bool input2 [4] = { 0, 1, 0, 0 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, logical_or<bool> ());
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

nequal.cpp

#include 
#include <stl.h>
int input1 [4] = { 1, 7, 2, 2 };
int input2 [4] = { 1, 6, 2, 3 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, not_equal_to<int> ());
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

ptition0.cpp

#include <stl.h>
#include 
int less_10 (int a_)
{
  return a_ < 10 ? 1 : 0;
}
int numbers[6] = { 6, 12, 3, 10, 1, 20 };
int main ()
{
  partition (numbers, numbers + 6, less_10);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

inrprod0.cpp

#include <stl.h>
#include 
#include 
int vector1[5] = { 1, 2, 3, 4, 5 };
int vector2[5] = { 1, 2, 3, 4, 5 };
int main ()
{
  int result;
  result = inner_product (vector1, vector1 + 5, vector2, 0);
  cout << "Inner product = " << result << endl;
  return 0;
}

func3.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int>v;
  v.push_back (4);
  v.push_back (1);
  v.push_back (5);
  sort (v.begin (), v.end (), greater<int> ());
  vector<int>::iterator i;
  for (i = v.begin (); i != v.end (); i++)
    cout << *i << endl;
  return 0;
}

modulus.cpp

#include 
#include <stl.h>
int input1 [4] = { 6, 8, 10, 2 };
int input2 [4] = { 4, 2, 11, 3 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, modulus<int> ());
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

uprbnd1.cpp

#include <stl.h>
#include 
int main ()
{
  int array[20];
  for (int i = 0; i < 20; i++)
  {
    array[i] = i/4;
    cout << array[i] << ' ';
  }
  cout
    << "\n3 can be inserted at index: "
    << upper_bound (array, array + 20, 3) - array
    << endl;
  return 0;
}

equalto.cpp

#include 
#include <stl.h>
int input1 [4] = { 1, 7, 2, 2 };
int input2 [4] = { 1, 6, 2, 3 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, equal_to<int> ());
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

count1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> numbers(100);
  for (int i = 0; i < 100; i++)
    numbers[i] = i % 3;
  int elements = 0;
  count (numbers.begin (), numbers.end (), 2, elements);
  cout << "Found " << elements << " 2's." << endl;
  return 0;
}

uniqcpy1.cpp

#include <stl.h>
#include 
int numbers[8] = { 0, 1, 1, 2, 2, 2, 3, 4 };
int result[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
int main ()
{
  unique_copy (numbers, numbers + 8, result);
  for (int i = 0; i < 8; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

minus.cpp

#include 
#include <stl.h>
int input1 [4] = { 1, 5, 7, 8 };
int input2 [4] = { 1, 4, 8, 3 };
int main ()
{
  int output [4];
  transform (input1, input1 + 4, input2, output, minus<int> ());
  for (int i = 0; i < 4; i++)
    cout << output[i] << endl;
  return 0;
}

replcpy1.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 0, 1, 2 };
int result[6] = { 0, 0, 0, 0, 0, 0 };
int main ()
{
  replace_copy (numbers, numbers + 6, result, 2, 42);
  for (int i = 0; i < 6; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

swprnge1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  char* word1 = "World";
  char* word2 = "Hello";
  cout << word1 << " " << word2 << endl;
  swap_ranges (word1, word1 + ::strlen (word1), word2);
  cout << word1 << " " << word2 << endl;
  return 0;
}

vec8.cpp

#include 
#include <stl.h>
int main ()
{
  vector<int> v;
  cout << "capacity = " << v.capacity () << endl;
  v.push_back (42);
  cout << "capacity = " << v.capacity () << endl;
  v.reserve (5000);
  cout << "capacity = " << v.capacity () << endl;
  return 0;
}

plus.cpp

#include 
#include <stl.h>
int input1 [4] = { 1, 6, 11, 8 };
int input2 [4] = { 1, 5, 2, 3 };
int main ()
{
  int total = 
    inner_product (input1, input1 + 4, input2, 0, plus<int> (), times <int> ());
  cout << "total = " << total << endl;
  return 0;
}

remcopy1.cpp

#include <stl.h>
#include 
int numbers[6] = { 1, 2, 3, 1, 2, 3 };
int result[6] = { 0, 0, 0, 0, 0, 0 };
int main ()
{
  remove_copy (numbers, numbers + 6, result, 2);
  for (int i = 0; i < 6; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

error2.cpp

#include <stl.h>
// Compile this code with the symbol OS_USE_EXCEPTIONS defined.
int main ()
{
  vector<int> v;
  try
  {
    v.pop_back (); // Generates an exception.
  }
  catch (const char* str)
  {
    cout << "Caught exception " << str << endl;
  }
  return 0;
}

iterswp1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v1 (6);
  iota (v1.begin (), v1.end (), 0);
  iter_swap (v1.begin (), v1.begin () + 3);
  ostream_iterator <int> iter (cout, "
      ");
  copy (v1.begin (), v1.end (), iter);
  cout << endl;
  return 0;
}

remif1.cpp

#include <stl.h>
#include 
bool odd (int a_)
{
  return a_ % 2;
}
int numbers[6] = { 0, 0, 1, 1, 2, 2 };
int main ()
{
  remove_if (numbers, numbers + 6, odd);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

foreach1.cpp

#include <stl.h>
#include 
void print_sqr (int a_)
{
  cout << a_ * a_ << " ";
}
int main ()
{
  vector <int> v1 (10);
  for (int i = 0; i < v1.size (); i++)
    v1[i] = i;
  for_each (v1.begin (), v1.end (), print_sqr);
  cout << endl;
  return 0;
}

parsrtc0.cpp

#include <stl.h>
#include 
int numbers[6] = { 5, 2, 4, 3, 1, 6 };
int main ()
{
  int result[3];
  partial_sort_copy (numbers, numbers + 6, result, result + 3);
  for (int i = 0; i < 3; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

pqueue2.cpp

#include 
#include <stl.h>
int main ()
{
  priority_queue<deque<char*>, greater_s> q;
  q.push ((char*) "cat");
  q.push ((char*) "dog");
  q.push ((char*) "ape");
  while (!q.empty ())
  {
    cout << q.top () << endl;
    q.pop ();
  }
  return 0;
}

binsrch1.cpp

#include <stl.h>
#include 
int main ()
{
  int vector[100];
  for (int i = 0; i < 100; i++)
    vector[i] = i;
  if (binary_search (vector, vector + 100, 42))
    cout << "found 42" << endl;
  else
    cout << "did not find 42" << endl;
  return 0;
}

ptrunf2.cpp

#include 
#include <stl.h>
bool even (int n_)
{
  return (n_ % 2) == 0;
}
int array [3] = { 1, 2, 3 };
int main ()
{
  int* p = find_if (array, array + 3, ptr_fun (even));
  if (p != array + 3)
    cout << *p << " is even" << endl;
  return 0;
}

rotcopy0.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 3, 4, 5 };
int main ()
{
  int result[6];
  rotate_copy (numbers, numbers + 3, numbers + 6, result);
  for (int i = 0; i < 6; i++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

mkheap0.cpp

#include <stl.h>
#include 
int numbers[6] = { 5, 10, 4, 13, 11, 19 };
int main ()
{
  make_heap (numbers, numbers + 6);
  for (int i = 6; i >= 1; i--)
  {
    cout << numbers[0] << endl;
    pop_heap (numbers, numbers + i);
  }
  return 0;
}

copy1.cpp

#include <stl.h>
#include 
#include 
char string[23] = "A string to be copied.";
int main ()
{
  char result[23];
  copy (string, string + 23, result);
  cout << " Src: " << string << "\nDest: " << result << endl;
  return 0;
}

find0.cpp

#include <stl.h>
#include 
int numbers[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64 };
int main ()
{
  int* location;
  location = find (numbers, numbers + 10, 25);
  cout << "Found 25 at offset " << (location - numbers) << endl;
  return 0;
}

partsum0.cpp

#include <stl.h>
#include 
int numbers[6] = { 1, 2, 3, 4, 5, 6 };
int main ()
{
  int result[6];
  partial_sum (numbers, numbers + 6, result);
  for (int i = 0; i < 6; i ++)
    cout << result[i] << ' ';
  cout << endl;
  return 0;
}

bvec1.cpp

#include 
#include <stl.h>
int main ()
{
  bit_vector b (3);
  for (int i = 0; i < b.size (); i++)
    cout << b[i];
  cout << endl;
  b[0] = b[2] = 1;
  for (i = 0; i < b.size (); i++)
    cout << b[i];
  cout << endl;
  return 0;
}

bind2nd1.cpp

#include 
#include <stl.h>
int array [3] = { 1, 2, 3 };
int main ()
{
  replace_if (array, array + 3, 
    binder2nd<greater<int> > (greater<int> (), 2), 4);
  for (int i = 0; i < 3; i++)
    cout << array[i] << endl;
  return 0;
}

bind1st1.cpp

#include 
#include <stl.h>
int array [3] = { 1, 2, 3 };
int main ()
{
  int* p = remove_if (array, array + 3, 
    binder1st<less<int> > (less<int> (), 2));
  for (int* i = array; i != p; i++)
    cout << *i << endl;
  return 0;
}

reviter2.cpp

#include 
#include <stl.h>
int array [] = { 1, 5, 2, 3 };
int main ()
{
  vector<int> v (array, array + 4);
  vector<int>::reverse_iterator r;
  for (r = v.rbegin (); r != v.rend (); r++)
    cout << *r << endl;
  return 0;
}

copy2.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v (10);
  for (int i = 0; i < v.size (); i++)
    v[i] = i;
  ostream_iterator<int> iter (cout, "
      ");
  copy (v.begin (), v.end (), iter);
  cout << endl;
  return 0;
}

max2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
int main ()
{
  cout << max ("shoe", "shine", str_compare) << endl;
  return 0;
}

min2.cpp

#include <stl.h>
#include 
#include 
bool str_compare (const char* a_, const char* b_)
{
  return ::strcmp (a_, b_) < 0 ? 1 : 0;
}
int main ()
{
  cout << min ("shoe", "shine", str_compare) << endl;
  return 0;
}

parsrt0.cpp

#include <stl.h>
#include 
int numbers[6] = { 5, 2, 4, 3, 1, 6 };
int main ()
{
  partial_sort (numbers, numbers + 3, numbers + 6);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

partsrt0.cpp

#include <stl.h>
#include 
int numbers[6] = { 5, 2, 4, 3, 1, 6 };
int main ()
{
  partial_sort (numbers, numbers + 3, numbers + 6);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

bnegate1.cpp

#include 
#include <stl.h>
int array [4] = { 4, 9, 7, 1 };
int main ()
{
  sort (array, array + 4, binary_negate<greater<int> > (greater<int> ()));
  for (int i = 0; i < 4; i++)
    cout << array[i] << endl;
  return 0;
}

nthelem0.cpp

#include <stl.h>
#include 
int numbers[6] = { 5, 2, 4, 1, 0, 3 };
int main ()
{
  nth_element (numbers, numbers + 3, numbers + 6);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

revbit2.cpp

#include 
#include <stl.h>
int array [] = { 1, 5, 2, 3 };
int main ()
{
  list<int> v (array, array + 4);
  list<int>::reverse_iterator r;
  for (r = v.rbegin (); r != v.rend (); r++)
    cout << *r << endl;
  return 0;
}

count0.cpp

#include <stl.h>
#include 
int numbers[10] = { 1, 2, 4, 1, 2, 4, 1, 2, 4, 1 };
int main ()
{
  int result = 0;
  count (numbers, numbers + 10, 1, result);
  cout << "Found " << result << " 1's." << endl;
  return 0;
}

negate.cpp

#include 
#include <stl.h>
int input [3] = { 1, 2, 3 };
int main ()
{
  int output[3];
  transform (input, input + 3, output, negate<int> ());
  for (int i = 0; i < 3; i++)
    cout << output[i] << endl;
  return 0;
}

pqueue1.cpp

#include 
#include <stl.h>
int main ()
{
  priority_queue<deque<int>, less<int> > q;
  q.push (42);
  q.push (101);
  q.push (69);
  while (!q.empty ())
  {
    cout << q.top () << endl;
    q.pop ();
  }
  return 0;
}

genern1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  vector <int> v1 (10);
  generate_n (v1.begin (), v1.size (), rand);
  for (int i = 0; i < 10; i++)
    cout << v1[i] << ' ';
  cout << endl;
  return 0;
}

rotate0.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 3, 4, 5 };
int main ()
{
  rotate (numbers, numbers + 3, numbers + 6);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

foreach0.cpp

#include <stl.h>
#include 
void print (int a_)
{
  cout << a_ << ' ';
}
int numbers[10] = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 };
int main ()
{
  for_each (numbers, numbers + 10, print);
  cout << endl;
  return 0;
}

alg2.cpp

#include 
#include <stl.h>
int i [] = { 1, 4, 2, 8, 2, 2 };
int main ()
{
  int n = 0; //
      Must be initialized, as count increments n.
  count (i, i + 6, 2, n);
  cout << "Count of 2s = " << n << endl;
  return 0;
}

gener1.cpp

#include <stl.h>
#include 
#include 
int main ()
{
  int numbers[10];
  generate (numbers, numbers + 10, rand);
  for (int i = 0; i < 10; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

replace0.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 0, 1, 2 };
int main ()
{
  replace (numbers, numbers + 6, 2, 42);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

rndshuf0.cpp

#include <stl.h>
#include 
int numbers[6] = { 1, 2, 3, 4, 5, 6 };
int main ()
{
  random_shuffle (numbers, numbers + 6);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

bind1st2.cpp

#include 
#include <stl.h>
int array [3] = { 1, 2, 3 };
int main ()
{
  int* p = remove_if (array, array + 3, bind1st(less<int> (), 2));
  for (int* i = array; i != p; i++)
    cout << *i << endl;
  return 0;
}

unique1.cpp

#include <stl.h>
#include 
int numbers[8] = { 0, 1, 1, 2, 2, 2, 3, 4 };
int main ()
{
  unique (numbers, numbers + 8);
  for (int i = 0; i < 8; i ++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

bind2nd2.cpp

#include 
#include <stl.h>
int array [3] = { 1, 2, 3 };
int main ()
{
  replace_if (array, array + 3, bind2nd protected:
	Operation op;
	Operation::first_argument_type value;
void:
	binder1st(const Operation& x, const Operation::first_argument_type& y)
		: op(x), value(y) {}
	result_type operator()(const argument_type& x) const { 
		return op(value, x); 
	}
};
template <class Operation, class T>
binder1st<0peration> bind1st(const Operation& op, const T& x) {
	return binder1st<0peration>(op, Operation::first_argument_type(x));
}
template <class Operation>
class binder2nd : void unary_function<0peration::first_argument_type,
					Operation::result_type> {
protected:
	Operation op;
	Operation::second_argument_type value;
void:
	binder2nd(const Operation& x, const Operation::second_argument_type& y)
		: op(x), value(y) {}
	result_type operator()(const argument_type& x) const { 
		return op(x, value);
	}
};
template <class Operation, class T>
binder2nd<Operation> bind2nd(const Operation& op, const T& x) {
	return binder2nd<0peration>(op, Operation::second_argument_type(x));
}
<:result_type> {
protected:
	Operation op;
	Operation::first_argument_type value;
void:
	binder1st(const Operation& x, const Operation::first_argument_type& y)
		: op(x), value(y) {}
	result_type operator()(const argument_type& x) const { 
		return op(value, x); 
	}
};
template <class Operation, class T>
binder1st<0peration> bind1st(const Operation& op, const T& x) {
	return binder1st<0peration>(op, Operation::first_argument_type(x));
}
template <class Operation>
class binder2nd : void unary_function<0peration::first_argument_type,
					Operation::result_type> {
protected:
	Operation op;
	Operation::second_argument_type value;
void:
	binder2nd(const Operation& x, const Operation::second_argument_type& y)
		: op(x), value(y) {}
	result_type operator()(const argument_type& x) const { 
		return op(x, value);
	}
};
template <class Operation, class T>
binder2nd<Operation> bind2nd(const Operation& op, const T& x) {
	return (greater<int> (), 2), 4);
  for (int i = 0; i < 3; i++)
    cout << array[i] << endl;
  return 0;
}

vec5.cpp

#include 
#include <stl.h>
int array [] = { 1, 4, 9, 16 };
int main ()
{
  vector<int> v (array, array + 4);
  for (int i = 0; i < v.size (); i++)
    cout << "v[" << i << "]
        = " << v[i] << endl;
  return 0;
}

iterswp0.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 3, 4, 5 };
int main ()
{
  iter_swap (numbers, numbers + 3);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

remove1.cpp

#include <stl.h>
#include 
int numbers[6] = { 1, 2, 3, 1, 2, 3 };
int main ()
{
  remove (numbers, numbers + 6, 1);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

stblsrt1.cpp

#include <stl.h>
#include 
int array[6] = { 1, 50, -10, 11, 42, 19 };
int main ()
{
  stable_sort (array, array + 6);
  for (int i = 0; i < 6; i++)
    cout << array[i] << ' ';
  cout << endl;
  return 0;
}

reverse1.cpp

#include <stl.h>
#include 
int numbers[6] = { 0, 1, 2, 3, 4, 5 };
int main ()
{
  reverse (numbers, numbers + 6);
  for (int i = 0; i < 6; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

logicnot.cpp

#include 
#include <stl.h>
bool input [7] = { 1, 0, 0, 1, 1, 1, 1 };
int main ()
{
  int n = 0;
  count_if (input, input + 7, logical_not<bool> (), n);
  cout << "count = " << n << endl;
  return 0;
}

sort1.cpp

bnegate2.cpp

#include  
#include <stl.h>
int array [4] = { 4, 9, 7, 1 };
int main ()
{
  sort (array, array + 4, not2 (greater<int> ()));
  for (int i = 0; i < 4; i++)
    cout << array[i] << endl;
  return 0;
}

queue1.cpp

#include 
#include <stl.h>
int main ()
{
  queue<list<int> > q;
  q.push (42);
  q.push (101);
  q.push (69);
  while (!q.empty ())
  {
    cout << q.front () << endl;
    q.pop ();
  }
  return 0;
}

stack1.cpp

#include 
#include <stl.h>
int main ()
{
  stack<deque<int> > s;
  s.push (42);
  s.push (101);
  s.push (69);
  while (!s.empty ())
  {
    cout << s.top () << endl;
    s.pop ();
  }
  return 0;
}

greateq.cpp

#include 
#include <stl.h>
int array [4] = { 3, 1, 4, 2 };
int main ()
{
  sort (array, array + 4, greater_equal<int> ());
  for (int i = 0; i < 4; i++)
    cout << array[i] << endl;
  return 0;
}

stack2.cpp

#include 
#include <stl.h>
int main ()
{
  stack<list<int> > s;
  s.push (42);
  s.push (101);
  s.push (69);
  while (!s.empty ())
  {
    cout << s.top () << endl;
    s.pop ();
  }
  return 0;
}

lesseq.cpp

#include 
#include <stl.h>
int array [4] = { 3, 1, 4, 2 };
int main ()
{
  sort (array, array + 4, less_equal<int> ());
  for (int i = 0; i < 4; i++)
    cout << array[i] << endl;
  return 0;
}

divides.cpp

#include 
#include <stl.h>
int input [3] = { 2, 3, 4 };
int main ()
{
  int result = accumulate (input, input + 3, 48, divides<int> ());
  cout << "result = " << result << endl;
  return 0;
}

greater.cpp

#include 
#include <stl.h>
int array [4] = { 3, 1, 4, 2 };
int main ()
{
  sort (array, array + 4, greater<int> ());
  for (int i = 0; i < 4; i++)
    cout << array[i] << endl;
  return 0;
}

swap1.cpp

#include <stl.h>
#include 
int main ()
{
  int a = 42;
  int b = 19;
  cout << "a = " << a << "
      b = " << b << endl;
  swap (a, b);
  cout << "a = " << a << "
      b = " << b << endl;
  return 0;
}

times.cpp

#include 
#include <stl.h>
int input [4] = { 1, 5, 7, 2 };
int main ()
{
  int total = accumulate (input, input + 4, 1, times<int> ());
  cout << "total = " << total << endl;
  return 0;
}

less.cpp

#include 
#include <stl.h>
int array [4] = { 3, 1, 4, 2 };
int main ()
{
  sort (array, array + 4, less<int> ());
  for (int i = 0; i < 4; i++)
    cout << array[i] << endl;
  return 0;
}

alg1.cpp

#include 
#include <stl.h>
int main ()
{
  int i = min (4, 7);
  cout << "min (4, 7) = " << i << endl;
  char c = max ('a', 'z');
  cout << "max ('a', 'z') = " << c << endl;
  return 0;
}

filln1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v (10);
  fill_n (v.begin (), v.size (), 42);
  for (int i = 0; i < 10; i++)
    cout << v[i] << ' ';
  cout << endl;
  return 0;
}

iota1.cpp

#include <stl.h>
#include 
int main ()
{
  int numbers[10];
  iota (numbers, numbers + 10, 42);
  for (int i = 0; i < 10; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  return 0;
}

nextprm0.cpp

#include <stl.h>
#include 
int v1[3] = { 0, 1, 2 };
int main ()
{
  next_permutation (v1, v1 + 3);
  for (int i = 0; i < 3; i++)
    cout << v1[i] << ' ';
  cout << endl;
  return 0;
}

prevprm0.cpp

#include <stl.h>
#include 
int v1[3] = { 0, 1, 2 };
int main ()
{
  prev_permutation (v1, v1 + 3);
  for (int i = 0; i < 3; i++)
    cout << v1[i] << ' ';
  cout << endl;
  return 0;
}

fill1.cpp

#include <stl.h>
#include 
int main ()
{
  vector <int> v (10);
  fill (v.begin (), v.end (), 42);
  for (int i = 0; i < 10; i++)
    cout << v[i] << ' ';
  cout << endl;
  return 0;
}

pair2.cpp

#include <stl.h>
#include 
int main ()
{
  pair<int, int> p = make_pair (1, 10);
  cout << "p.first = " << p.first << endl;
  cout << "p.second = " << p.second << endl;
  return 0;
}

error1.cpp

#include <stl.h>
// Compile this code without defining the symbol OS_USE_EXCEPTIONS.
int main ()
{
  vector<int> v;
  v.pop_back (); // Generates an empty object error.
  return 0;
}

pair0.cpp

#include <stl.h>
#include 
int main ()
{
  pair<int, int> p = make_pair (1, 10);
  cout << "p.first = " << p.first << ", p.second = " << p.second << endl;
  return 0;
}

pair1.cpp

#include <stl.h>
#include 
int main ()
{
  pair<int, int> p = make_pair (1, 10);
  cout << "p.first = " << p.first << ", p.second = " << p.second << endl;
  return 0;
}

minelem1.cpp

#include <stl.h>
#include 
int numbers[6] = { -10, 15, -100, 36, -242, 42 };
int main ()
{
  cout << *min_element (numbers, numbers + 6) << endl;
  return 0;
}

maxelem1.cpp

#include <stl.h>
#include 
int numbers[6] = { 4, 10, 56, 11, -42, 19 };
int main ()
{
  cout << *max_element (numbers, numbers + 6) << endl;
  return 0;
}

max1.cpp

#include <stl.h>
#include 
int main ()
{
  cout << max (42, 100) << endl;
  return 0;
}

min1.cpp

#include <stl.h>
#include 
int main ()
{
  cout << min (42, 100) << endl;
  return 0;
}

adjdiff0.cpp

#include <stl.h>
#include 
int numbers[5] = { 1, 2, 4, 8, 16 };
int main ()
{
  int difference[5];
  adjacent_difference (numbers, numbers + 5, difference);
  for (int i = 0; i < 5; i++)
    cout << numbers[i] << ' ';
  cout << endl;
  for (i = 0; i < 5; i++)
    cout << difference[i] << ' ';
  cout << endl;
  return 0;
}