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
00079
00080
00081
00082
00083
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 };