avr39ripe

cppArrayAElNotInBSTLLike

May 19th, 2021 (edited)
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <typename T> bool sortUp(const T& a, const T& b)
  4. {
  5.     return a < b;
  6. }
  7.  
  8. template <typename T> bool sortDown(const T& a, const T& b)
  9. {
  10.     return a > b;
  11. }
  12.  
  13. template <typename T> void sort(T* begin, T* const end, bool(*sortCrit)(const T&, const T&), void(*print)(const T*, const T*) = nullptr)
  14. {
  15.     if (print) print(begin, end);
  16.     T tmp;
  17.     for (T* head{ begin }; head != end; ++head)
  18.     {
  19.         for (T* tail{ end - 1 }; tail != head; --tail)
  20.         {
  21.             if (sortCrit(*tail, *head))
  22.             {
  23.                 tmp = *tail;
  24.                 *tail = *head;
  25.                 *head = tmp;
  26.                 if (print) print(begin, end);
  27.             }
  28.         }
  29.  
  30.     }
  31.     if (print) print(begin, end);
  32. }
  33.  
  34. template <typename T>
  35. void print(const T* begin, const T* const end)
  36. {
  37.     while (begin != end)
  38.     {
  39.         std::cout << *begin++ << ' ';
  40.     }
  41.     std::cout << '\n';
  42. }
  43.  
  44. template <typename T>
  45. T* unique(T* begin, T* const end)
  46. {
  47.     T* insertPos{ begin + 1 };
  48.     for (; (insertPos != end) and (*insertPos != *(insertPos - 1)); ++insertPos);
  49.     if (insertPos == end) return end;
  50.  
  51.     begin = insertPos + 1;
  52.     while (begin != end)
  53.     {
  54.         if (*(insertPos - 1) != *begin)
  55.         {
  56.             *insertPos++ = *begin;
  57.         }
  58.         ++begin;
  59.     }
  60.     return insertPos;
  61. }
  62.  
  63. template <typename T>
  64. T* uniqualize(T* const begin, T* const end)
  65. {
  66.     sort(begin, end, sortUp<int>);
  67.     return unique(begin, end);
  68. }
  69.  
  70. template <typename T>
  71. const T* binSearch(const T* const begin, const T* const end, const T& key)
  72. {
  73.     const T* left{ begin };
  74.     const T* right{ end - 1 };
  75.     const T* mid;
  76.     while (true)
  77.     {
  78.         mid = left + ((right - left) / 2);
  79.         if (key == *mid) { return mid; };
  80.         if (key < *mid) { right = mid - 1; }
  81.         if (key > *mid) { left = mid + 1; }
  82.         if (left > right) { return end; };
  83.     }
  84. }
  85.  
  86. template <typename T>
  87. T* remove_if_ref(T* begin, T* const end, const T* const beginRef, const T* const endRef, bool(*pred)(const T*, const T*, const T&))
  88. {
  89.     T* insertPos{ begin };
  90.     for (; (insertPos != end) and !pred(beginRef, endRef, *insertPos); ++insertPos);
  91.     if (insertPos == end) return end;
  92.  
  93.     begin = insertPos + 1;
  94.     while (begin != end)
  95.     {
  96.         if (!pred(beginRef, endRef, *begin))
  97.         {
  98.             *insertPos++ = *begin;
  99.         }
  100.         ++begin;
  101.     }
  102.     return insertPos;
  103. }
  104.  
  105. template <typename T>
  106. bool isIn(const T* const begin, const T* const end, const T& el)
  107. {
  108.     return (binSearch(begin, end, el) != end);
  109. }
  110.  
  111. template <typename T>
  112. bool notIn(const T* const begin, const T* const end, const T& el)
  113. {
  114.     return (binSearch(begin, end, el) == end);
  115. }
  116.  
  117. template <typename T>
  118. size_t distance(const T* const begin, const T* const end)
  119. {
  120.     return end - begin;
  121. }
  122.  
  123. template <typename T>
  124. size_t copy(const T* srcB, const T* const srcE, T* destB, T* const destE)
  125. {
  126.     size_t copyCount{ 0 };
  127.     while (destB != destE and srcB != srcE)
  128.     {
  129.         *destB++ = *srcB++;
  130.         ++copyCount;
  131.     }
  132.     return copyCount;
  133. }
  134.  
  135. int* createArr(size_t size)
  136. {
  137.     return new int[size];
  138. }
  139.  
  140. void deleteArr(int* ptr)
  141. {
  142.     delete[] ptr;
  143. }
  144.  
  145. int main()
  146. {
  147.     const int arrASize{ 15 };
  148.     const int arrBSize{ 15 };
  149.     int arrA[arrASize] { 6,1,4,2,8,9,4,26,2,7,8,11,7,2,3 };
  150.     int arrB[arrBSize] { 1,8,29,2,2,9,11,1,2,5,8,34,12,9,8 };
  151.  
  152.     std::cout << "Original arrays:\n";
  153.     print(arrA, arrA + arrASize);
  154.     print(arrB, arrB + arrBSize);
  155.  
  156.     int* uniqueAPos{ uniqualize(arrA, arrA + arrASize) };
  157.     int* uniqueBPos{ uniqualize(arrB, arrB + arrBSize) };
  158.  
  159.     //std::cout << "\nOriginal arrays without duplicates:\n";
  160.     //print(arrA, uniqueAPos);
  161.     //print(arrB, uniqueBPos);
  162.  
  163.     int* resAPos{ remove_if_ref(arrA, uniqueAPos, arrB, uniqueBPos, isIn<int>) };
  164.     //std::cout << "\nArrayA elements not in arrayB:\n";
  165.     //print(arrA, resAPos);
  166.  
  167.     auto arrCSize{ distance(arrA, resAPos) };
  168.     auto arrC{ createArr(arrCSize) };
  169.     copy(arrA, resAPos, arrC, arrC + arrCSize);
  170.     std::cout << "\nArrayA elements not in arrayB without duplicates:\n";
  171.     print(arrC, arrC + arrCSize);
  172.     deleteArr(arrC);
  173.  
  174.     return 0;
  175. }
Add Comment
Please, Sign In to add comment