Sorting Objects Using STL

Here's an example of how using objects (hat-tip: Paul Wolfensberger)
#include <iostream>
#include <ostream>
#include <vector>
#include <algorithm>

// A base class to hold, return and output a value
class Item
{
private:
      int val;

public:
      Item( int x )
      {
            val =  x;
      }

      // Indicate the item type as a string
      virtual   char* ItemName() = 0;

      int GetVal() { return val; }
      void OutputToStream( std::ostream& os )
      {
          os << ItemName() << "\t" << val << "\n";
      }
};

// Derived class - "old"
class OldItem : public Item
{
      public:
      OldItem( int val )
          : Item( val )  { }

      char* ItemName()    {    return "Old: ";  }
};

// Derived class - "new"
class NewItem : public Item
{
public:
      NewItem( int val )
          : Item( val )  { }

      char* ItemName()    {    return "New: ";  }
};

// Item vector class definition. This class de-allocates
// objects in case you are forgetful.
class ItemVector : public std::vector< Item* >
{
public:

      // Avoid leaks by ensuring items are de-allocated
      ~ItemVector()
      {
          for ( iterator it = begin();
                it != end();
                ++ it )
          {
              delete *it;
          }
      }
};

// Define means of specifying how we want to sort the data:
// Ascending order in this example
struct Ascending
{
      bool operator() ( Item*& start, Item*& end )
      {
            return start->GetVal() < end->GetVal();
      }
};

void main()
{
      ItemVector itvect;

      // Insert some values...
      itvect.push_back( new OldItem( 43 ) );
      itvect.push_back( new NewItem( 34 ) );
      itvect.push_back( new NewItem( 443 ) );
      itvect.push_back( new OldItem( 433 ) );
      itvect.push_back( new OldItem( 343 ) );

      // Sort values in ascending order...
      std::sort( itvect.begin(),
                 itvect.end(),
                 Ascending() );

      // Show the results!
      for ( int i = 0; i < (int) itvect.size(); ++i )
      {
            itvect[ i ]->OutputToStream( std::cout );
      }

      // Pause for a response
      getchar();
}
And here is the output when it is run: A simpler demonstration using integer arrays:
class descending
{
public:
    bool operator()( int x, int y ) const
    {
        return x > y;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = { 100, 101, -2, 23, 1010, 44, 55, 3 };
    vector<int> v( a, a + 8 );

    sort( v.begin(), v.end(), descending() );  

    copy( v.begin(),
          v.end(),
          ostream_iterator<int>( cout, " " ) );

    return 0;
}

Comments

Popular posts from this blog

Using the Supervisor Controller Pattern to access View controls in MVVM

Getting started with Tesseract optical character recognition (OCR) library in Visual Studio

How to send an e-mail via Google SMTP using C#