3

Nothing new, but something for the neophyte to ponder. Some of the functions (algorithms) used by STL containers can be applied to a normal array to do inane things like copying, displaying, finding max/min, reversing, replacing, searching, shuffling, sorting, summation. This can really simplify your code.

Votes + Comments
Decent collection of examples..
// using STL container functions with arrays
// a Dev-C++ tested console application by  vegaseat  02jan2005

#include <iostream>
#include <algorithm>  // random_shuffle(), sort(), reverse() ...
#include <numeric>    // accumulate()
#include <iterator>   // ostream_iterator

using namespace std;

int main()
{
  // set up output for integers
  // display each element separated by a space
  ostream_iterator<int>  out(cout," ");

  // create an array of 10 integers
  int iA[10];

  // load the array
  for( int k = 0; k < 10; k++ )
  {
    iA[k] = k;
    //cout << iA[k] << endl;  // just a check
  }

  // set iterators to begin and end of the array
  // end does point one element past the loaded array
  // this is not an error!
  int * begin = &iA[0];
  int * end = &iA[10];

  // shuffle the array
  cout << "array after random_shuffle:\n";
  random_shuffle( begin, end );
  // iterate through the array and display
  copy( begin, end, out );
  cout << endl;

  // find max and min value
  int * m;
  m = max_element( begin, end);
  cout << "max value in array = " << *m << endl;
  m = min_element( begin, end);
  cout << "min value in array = " << *m << endl;

  // sort the array in ascending order
  cout << "array after sort:\n";
  sort( begin, end );
  copy( begin, end, out );
  cout << endl;

  // search for a specific value, here 7
  // needs sorted array!
  if (binary_search( begin, end, 7) == true)
  {
    cout << "found integer 7 in sorted array\n";
  }
  else
  {
    cout << "didn't find 7\n";
  }

  // reverse it
  cout << "sorted array in reverse:\n";
  reverse( begin, end );
  copy( begin, end, out );
  cout << endl;

  // replace any integer 3 with integer 8
  cout << "sorted again and replaced 3 with an 8:\n";
  sort( begin, end );
  replace( begin, end, 3, 8 );
  copy( begin, end, out );
  cout << endl;

  // replace any integers 8 with 3
  cout << "replaced (any) 8 with 3:\n";
  replace( begin, end, 8, 3 );
  copy( begin, end, out );
  cout << endl;

  // add up all the integer values (init = 0)
  int sum = accumulate( begin, end, 0);
  cout << "sum of integer elements in array = " << sum << endl;
  // copy array iA into array iB
  // note that begin and end are the iterators for array iA
  int iB[10] = {0};
  copy( begin, end, iB );
  cout << "copy array iA into array iB:" << endl;
  for( int k = 0; k < 10; k++ )
  {
    cout << iB[k] << endl;
  }
  cout << endl;

  // strings anyone?
  string sA[10];
  sA[0] = "Exact estimate";
  sA[1] = "Pretty ugly";
  sA[2] = "Diet ice cream";
  sA[3] = "Tight slacks";
  sA[4] = "Plastic glasses";
  sA[5] = "Butt Head";
  sA[6] = "Alone together";
  sA[7] = "Genuine imitation";
  sA[8] = "Found missing";
  sA[9] = "Business ethics";

  // set iterators to beginning and end of string array
  // notice that endstr goes one element past the loaded array
  string * beginstr = &sA[0];
  string * endstr = &sA[10];
  // change the output to handle strings and
  // display each string on a new line
  ostream_iterator<string>  outstr(cout,"\n");

  cout << "array as loaded:\n";
  copy( beginstr, endstr, outstr );
  cout << endl;

  // now for the fun of it ...
  // also, binary search needs a sorted array
  cout << "array after sort:\n";
  sort( beginstr, endstr );
  copy( beginstr, endstr, outstr );
  cout << endl;

  // you get the drift ...
  if (binary_search( beginstr, endstr, "Butt Head") == true)
  {
    cout << "found Butt Head in sorted array\n";
  }
  else
  {
    cout << "didn't find Butt Head\n";
  }
  cout << endl;

  cout << "let's reshuffle the strings:\n";
  // for those of you who want to simplify the code, but make 
  // it somewhat harder to read, you can imply the iterators
  //   random_shuffle( beginstr, endstr );
  //   copy( beginstr, endstr, outstr );
  // now becomes ...
  random_shuffle( sA, sA+10 );
  copy( sA, sA+10, outstr );
  cout << endl;
  
  // a simple search of an integer array
  int a[12] = {1, 2, 5, 7, 9, 8, 7, 3, 9, 8, 5, 7};
  int b[2] = {9, 8};  // search for b in a
  int *p1, *p2;

  p1 = search(a, a + 12, b, b + 2);    // get first match
  p2 = find_end(a, a + 12, b, b + 2);  // get last match
  cout << "looking for {9, 8} in {1, 2, 5, 7, 9, 8, 7, 3, 9, 8, 5, 7}:\n";
  cout << "search() index = " << p1 - a << "  find_end() index = " << p2 - a << endl;  

  cin.get();  // make console display wait for key press
  return 0;   // in the newer versions of C++ return is optional
}
2
Contributors
2
Replies
8
Views
12 Years
Discussion Span
Last Post by vegaseat
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.