smatskevich

Seminar6

Oct 28th, 2021
699
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6.  
  7. struct Point {
  8.     int X;
  9.     int Y;
  10.  
  11.     // Способ 1б. Оператор как метод внутри структуры.
  12.     bool operator<(const Point& other) const {
  13.         return X < other.X;
  14.     }
  15. };
  16.  
  17. // Способ 1. Оператор вне структуры/класса
  18. //bool operator<(const Point& p1, const Point& p2) {
  19. //    return p1.X < p2.X;
  20. //}
  21.  
  22. // Способ 2. Функция сравнения
  23. // Сравниваем по расстоянию от центра координат.
  24. bool CompareByDistance(const Point& p1, const Point& p2) {
  25.     int dist1sqr = p1.X * p1.X + p1.Y * p1.Y;
  26.     int dist2sqr = p2.X * p2.X + p2.Y * p2.Y;
  27.     return dist1sqr < dist2sqr;
  28. }
  29.  
  30. // Способ 3. Функтор.
  31. struct ComparatorByDistance {
  32.     explicit ComparatorByDistance(const Point& center = {0, 0}) : Center(center) {}
  33.     Point Center;
  34.     bool operator()(const Point& p1, const Point& p2) const;
  35. };
  36.  
  37. bool ComparatorByDistance::operator()(const Point& p1, const Point& p2) const {
  38.     int dist1sqr = (p1.X - Center.X) * (p1.X - Center.X) + (p1.Y - Center.Y) * (p1.Y - Center.Y);
  39.     int dist2sqr = (p2.X - Center.X) * (p2.X - Center.X) + (p2.Y - Center.Y) * (p2.Y - Center.Y);
  40.     return dist1sqr < dist2sqr;
  41. }
  42.  
  43.  
  44. void sort(std::vector<Point>& data, const ComparatorByDistance& comparator) {
  45.     int i = 0;
  46.     for (; i < data.size(); i++) {
  47.         bool swapped = false;
  48.         for (int j = 0; j < data.size() - 1 - i; j++) {
  49.             if (comparator(data[j + 1], data[j])) {
  50.                 std::swap(data[j], data[j + 1]);
  51.                 swapped = true;
  52.             }
  53.         }
  54.         if (!swapped) break;
  55.     }
  56. //    std::cout << "iterations = " << i + 1 << std::endl;
  57. }
  58.  
  59. //void sort(std::vector<Point>& data, bool (*comp)(const Point&, const Point&)) {
  60. //    int i = 0;
  61. //    for (; i < data.size(); i++) {
  62. //        bool swapped = false;
  63. //        for (int j = 0; j < data.size() - 1 - i; j++) {
  64. //            if (comp(data[j + 1], data[j])) {
  65. //                std::swap(data[j], data[j + 1]);
  66. //                swapped = true;
  67. //            }
  68. //        }
  69. //        if (!swapped) break;
  70. //    }
  71. ////    std::cout << "iterations = " << i + 1 << std::endl;
  72. //}
  73.  
  74. // Считывание до fail.
  75. int main() {
  76.     int n = 0;
  77.     std::cin >> n;
  78.     std::vector<Point> v(n);
  79.     for(int i = 0; i < n; ++i) std::cin >> v[i].X >> v[i].Y;
  80.  
  81.     ComparatorByDistance comp;
  82.     comp.Center = {3, 3};
  83.     std::sort(v.begin(), v.end(), comp);
  84.     //sort(v, comp);
  85.  
  86.     for (Point& x: v) {
  87.         std::cout << x.X << " " << x.Y << std::endl;
  88.     }
  89. //
  90. //    int x = 0;
  91. //    const int y = 0;
  92. //    x = 4;
  93. //    y = 4;
  94.  
  95.     return 0;
  96. }
  97.  
  98. void SimplePrint(int x) {
  99.     std::cout << x;
  100. }
  101.  
  102. void BeautifulPrint(int x) {
  103.     std::cout << "** " << x << " **" << std::endl;
  104. }
  105.  
  106. typedef long long ll;
  107. typedef void (*printer_function)(int);
  108.  
  109. void PrintVector(const std::vector<int>& x, void (*printer)(int)) {
  110.     for (int value : x) {
  111.         printer(value);
  112.     }
  113. }
  114.  
  115. void PrintVector2(const std::vector<int>& x, printer_function f) {
  116.     for (int value : x) {
  117.         f(value);
  118.     }
  119. }
  120.  
  121. int main1() {
  122.     int n = 0;
  123.     std::cin >> n;
  124.     std::vector<int> v(n);
  125.     for (int i = 0; i < n; ++i) std::cin >> v[i];
  126.     PrintVector(v, &SimplePrint);
  127.     PrintVector2(v, BeautifulPrint);
  128.     return 0;
  129. }
RAW Paste Data