Advertisement
smatskevich

Comparison for sorting

Oct 27th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3.  
  4. // Структура, массив объектов которых будем сортировать.
  5. struct CDate {
  6.     short Day;
  7.     short Month;
  8.     short Year;
  9.  
  10.     bool operator<( const CDate& other ) const;
  11. };
  12.  
  13. // Вариант 1. Оператор сравнения.
  14. bool CDate::operator<( const CDate& other ) const
  15. {
  16.     return Year < other.Year ||
  17.         ( Year == other.Year && ( Month < other.Month ||
  18.             ( Month == other.Month && Day < other.Day ) ) );
  19. }
  20.  
  21. namespace std {
  22.     // Явная специализация.
  23.     template<>
  24.     void swap<CDate>( CDate& left, CDate& right )
  25.     {
  26.         CDate temp = left;
  27.         left = right;
  28.         right = temp;
  29.     }
  30. }
  31.  
  32. // Вариант 2. Функция сравнения.
  33. typedef bool( *TCompareFunction )( const CDate&, const CDate& );
  34.  
  35. bool MyCompareFunction( const CDate& left, const CDate& right )
  36. {
  37.     return left < right;
  38. }
  39.  
  40. // Вариант 3. Функтор - класс с определенным оператором "круглые скобки от двух аргументов".
  41. class CMyFunctor {
  42. public:
  43.     explicit CMyFunctor( bool _doCompare ) : doCompare( _doCompare ) {}
  44.     bool operator()( const CDate& left, const CDate& right ) { return doCompare && left < right; }
  45.  
  46. private:
  47.     bool doCompare;
  48. };
  49.  
  50. // Собственно сортировка.
  51. template<class T, class Functor>
  52. void BubbleSort( T* vector, int n, Functor functor )
  53. {
  54.     for( int i = 0; i < n - 1; ++i ) {
  55.         for( int j = 0; j < n - 1; ++j ) {
  56.             if( functor( vector[j + 1], vector[j] ) ) {
  57.                 std::swap( vector[j], vector[j + 1] );
  58.             }
  59.         }
  60.     }
  61. }
  62.  
  63. int main()
  64. {
  65.     int n = 0;
  66.     std::cin >> n;
  67.  
  68.     CDate* dates = new CDate[n];
  69.     for( int i = 0; i < n; ++i ) {
  70.         std::cin >> dates[i].Day;
  71.         std::cin >> dates[i].Month;
  72.         std::cin >> dates[i].Year;
  73.     }
  74.     CMyFunctor myFunctor( false );
  75.     BubbleSort( dates, n, myFunctor );
  76.     for( int i = 0; i < n; ++i ) {
  77.         std::cout << dates[i].Day << "." << dates[i].Month << "." << dates[i].Year << std::endl;
  78.     }
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement