Main Page | Namespace List | Data Structures | File List | Namespace Members | Data Fields | Globals

sorttest.cpp

Go to the documentation of this file.
00001 
00002 #include <iostream>
00003 
00004 #include "pairit.hh"
00005 
00006 #include <boost/timer.hpp>
00007 #include <boost/numeric/ublas/vector.hpp>
00008 #include <boost/numeric/ublas/io.hpp>
00009 
00010 using std::size_t;
00011 using std::cout;
00012 using std::endl;
00013 
00014 
00015 using namespace boost::numeric::ublas;
00016 using namespace iterators;
00017 
00018 struct MyPairComparisonFunctor { 
00019   template<typename PairType> 
00020   bool operator()(const PairType& left,const PairType& right) const
00021   {
00022         return ( (left.first < right.first) ||
00023                          (left.first == right.first && left.second.first < right.second.first) );
00024   }
00025 };
00026           
00027 struct MyPairComparisonFunctor2 { 
00028   template<typename PairType> 
00029   bool operator()(const PairType& left,const PairType& right) const
00030   {
00031         return ( (left.first.first < right.first.first) ||
00032                          (left.first.first == right.first.first && left.first.second < right.first.second) );
00033   }
00034 };
00035           
00036 struct MyPairComparisonFunctor3 { 
00037   template<typename PairType> 
00038   bool operator()(const PairType& left,const PairType& right) const
00039   {
00040         return ( (left.first < right.first) ||
00041                          (left.first == right.first && left.second < right.second) );
00042   }
00043 };
00044           
00045 int main(size_t argc, char *argv[])
00046 {
00047   size_t size = 20;
00048 
00049   if (argc > 1)
00050         size = ::atoi (argv [1]);
00051 
00052   typedef vector <size_t> V1;
00053   typedef vector <size_t> V2;
00054   typedef vector <long double> V3;
00055 
00056   V1 v1(size);
00057   V2 v2(size);
00058   V3 v3(size);
00059 
00060   for (size_t i=0; i<size; ++i) {
00061         v1(i) = (5*i+3) % size;
00062         v2(i) = (7*i+1) % size;
00063         v3(i) = i;
00064   }
00065 
00066   if (size < 200) {
00067         cout << v1 << endl;
00068         cout << v2 << endl;
00069         cout << v3 << endl;
00070   }
00071 
00072   boost::timer t;
00073 
00074   t.restart();
00075   std::stable_sort( makePairIterator(v1.begin(), makePairIterator(v2.begin(), v3.begin())),
00076                          makePairIterator(v1.end(), makePairIterator(v2.end(), v3.end())),
00077                          MyPairComparisonFunctor() );
00078 //   std::stable_sort( makePairIterator(makePairIterator(v1.begin(), v2.begin()), v3.begin()),
00079 //                                      makePairIterator(makePairIterator(v1.end(), v2.end()), v3.end()),
00080 //                                      MyPairComparisonFunctor2() );
00081 //   std::stable_sort( makePairIterator(v1.begin(), v2.begin()),
00082 //                                      makePairIterator(v1.end(), v2.end()),
00083 //                                      MyPairComparisonFunctor3() );
00084 
00085   cout << "sort time " << t.elapsed() << endl;
00086 
00087   if (size < 200) {
00088         cout << v1 << endl;
00089         cout << v2 << endl;
00090         cout << v3 << endl;
00091   }
00092 
00093   std::sort(v3.begin(), v3.end());
00094   bool ok = true;
00095   if (v3(0) == 0) {
00096         for (size_t i=1; i < size; ++i) {
00097           if ( (v1(i-1) > v1(i)) || 
00098                    (v1(i-1) == v1(i) && v2(i-1) > v2(i) ) ) {
00099                 cout << "wrong order: " << i << endl;
00100                 ok = false;
00101                 break;
00102           }
00103           if (v3(i) != i) {
00104                 ok = false;
00105                 cout << "lost data: " << i << endl;
00106                 break;
00107           }
00108         }
00109   } else {
00110         ok = false;
00111         cout << "lost data: 0" << endl;
00112   }
00113 
00114   cout << (ok?"ok":"not ok") << endl;
00115 
00116 };

Generated on Wed Oct 1 14:41:00 2003 for Sample Code by doxygen 1.3.2