loulett

HW4_templates

Mar 15th, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #define _SCL_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5.  
  6. struct stud
  7. {
  8.     char name[10];
  9.     int age;
  10. };
  11.  
  12. bool less(const stud& a, const stud& b)
  13. {
  14.     return a.age < b.age;
  15. }
  16.  
  17. template <typename T>
  18. class Array
  19. {
  20. public:
  21.     Array() : array(0), size(0), capacity(0) {}
  22.     ~Array() { delete[] array; }
  23.  
  24.     void append(const T& value);
  25.     void print();
  26.     template <typename Comarator>
  27.     void qsort(int left, int right, Comarator less);
  28. private:
  29.     T* array;
  30.     size_t size;
  31.     size_t capacity;
  32.     template <typename Comarator>
  33.     int partition(int left, int right, Comarator less);
  34. };
  35.  
  36. template <typename T>
  37. template <typename Compare>
  38. int Array<T>::partition(int left, int right, Compare less)
  39. {
  40.     int i = left - 1;
  41.     for (int j = 1; j < right - 1;++j)
  42.     {
  43.         if (less(array[j], array[right - 1]))
  44.         {
  45.             i++;
  46.             std::swap(array[j], array[i]);
  47.         }
  48.     }
  49.     std::swap(array[i + 1], array[right - 1]);
  50.     return i + 1;
  51. }
  52.  
  53. template <typename T>
  54. template <typename Compare>
  55. void Array<T>::qsort(int left, int right, Compare less)
  56. {
  57.     if (left + 1 >= right)
  58.         return;
  59.     int q = partition(left, right, less);
  60.     qsort(left, q, less);
  61.     qsort(q + 1, right, less);
  62. }
  63.  
  64. template <typename T>
  65. void Array<T>::append(const T &value)
  66. {
  67.     if (size == capacity)
  68.     {
  69.         if (capacity)
  70.             capacity *= 2;
  71.         else
  72.             capacity = 1;
  73.         T* buffer = new T[capacity];
  74.         std::copy(array, array + size, buffer);
  75.         delete[] array;
  76.         array = buffer;
  77.     }
  78.     array[size++] = value;
  79. }
  80.  
  81. template <typename T>
  82. void Array<T>::print()
  83. {
  84.     for (size_t i = 0; i < size; i++)
  85.         std::cout << array[i] << '\n';
  86. }
  87.  
  88. template <>
  89. void Array<stud>::print()
  90. {
  91.     for (size_t i = 0; i < size; i++)
  92.         std::cout << array[i].name << ' ' << array[i].age << '\n';
  93. }
  94.  
  95. int main()
  96. {
  97.     Array <stud> arr;
  98.     stud a;
  99.     for (int i = 0; i < 3; i++)
  100.     {
  101.         std::cin >> a.name >> a.age;
  102.         arr.append(a);
  103.     }
  104.     arr.qsort(0, 3, less);
  105.     arr.print();
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment