Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- using std::vector;
- using std::cin;
- using std::cout;
- struct CPoint {
- int X;
- int Y;
- CPoint( int x, int y ) : X( x ), Y( y ) {}
- };
- // Вариант 1. Оператор сравнения. Сравнивает точки по удаленности от (0, 0).
- bool operator<( const CPoint& first, const CPoint& second )
- {
- return ( first.X * first.X + first.Y * first.Y ) <
- ( second.X * second.X + second.Y * second.Y );
- }
- bool operator>( const CPoint& first, const CPoint& second )
- {
- return second < first;
- }
- bool operator<=( const CPoint& first, const CPoint& second )
- {
- return !( second < first );
- }
- bool operator>=( const CPoint& first, const CPoint& second )
- {
- return !( first < second );
- }
- // Вариант 2. Функция сравнения. Сравнивает точки по удаленности от (0, 0).
- bool ComparePointsByDistanceFromZero( const CPoint& first, const CPoint& second )
- {
- return ( first.X * first.X + first.Y * first.Y ) <
- ( second.X * second.X + second.Y * second.Y );
- }
- typedef bool ( *TCompareFunction )( const CPoint&, const CPoint& );
- // Вариант 3. Функтор = класс с оператором ( , ).
- // Сравнивает точки по удаленности от некоторой фиксированной.
- class CPointsComparator {
- public:
- explicit CPointsComparator( const CPoint& _center ) : center( _center ) {}
- bool operator()( const CPoint& first, const CPoint& second ) const;
- private:
- CPoint center;
- };
- bool CPointsComparator::operator()( const CPoint& first, const CPoint& second ) const
- {
- return ( ( first.X - center.X ) * ( first.X - center.X ) +
- ( first.Y - center.Y ) * ( first.Y - center.Y ) ) <
- ( ( second.X - center.X ) * ( second.X - center.X ) +
- ( second.Y - center.Y ) * ( second.Y - center.Y ) );
- }
- // Шаблонная функция с двумя параметрами.
- // Вместо COMPARATOR можно передать указатель на функцию, а можно объект-функтор,
- // в котором определен оператор () для двух параметров.
- template< class T, class COMPARATOR >
- void BubbleSort( vector<T>& arr, COMPARATOR cmpFunction )
- {
- int n = static_cast< int >( arr.size() );
- for( int i = 0; i < n - 1; ++i ) {
- for( int j = 0; j <= n - i - 2; ++j ) {
- if( cmpFunction( arr[j + 1], arr[j] ) ) {
- std::swap( arr[j], arr[j + 1] );
- }
- }
- }
- }
- int main()
- {
- vector<CPoint> arr;
- while( true ) {
- int x = 0;
- int y = 0;
- if( !( cin >> x >> y ) ) {
- break;
- }
- arr.push_back( CPoint( x, y ) );
- }
- CPointsComparator comparator( CPoint( 3, 3 ) );
- BubbleSort<CPoint, CPointsComparator>( arr, comparator );
- for( int i = 0; i < static_cast<int>( arr.size() ); ++i ) {
- cout << arr[i].X << ' ' << arr[i].Y << std::endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement