Advertisement
avr39-ripe

selfSTLDRAFT

Apr 21st, 2020
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3.  
  4. template <typename T> bool sortUp(T a, T b)
  5. {
  6.     return a < b;
  7. }
  8.  
  9. template <typename T> bool sortDown(T a, T b)
  10. {
  11.     return a > b;
  12. }
  13.  
  14.  
  15. template <typename T> void sort(T* begin, T* end, bool(*sortCrit)(T, T), void(*print)(T*, T*) = nullptr)
  16. {
  17.     if (print) print(begin, end);
  18.     T tmp;
  19.     for (T* head{ begin }; head != end; ++head)
  20.     {
  21.         for (T* tail{ end - 1 }; tail != head; --tail)
  22.         {
  23.             if (sortCrit(*tail, *head))
  24.             {
  25.                 tmp = *tail;
  26.                 *tail = *head;
  27.                 *head = tmp;
  28.                 if (print) print(begin, end);
  29.             }
  30.         }
  31.  
  32.     }
  33.     if (print) print(begin, end);
  34. }
  35.  
  36. template <typename T>
  37. void print(T* begin, T* end)
  38. {
  39.     while (begin != end)
  40.     {
  41.         std::cout << *begin++ << ' ';
  42.     }
  43.     std::cout << '\n';
  44. }
  45.  
  46. template <typename T>
  47. T* unique(T* begin, T* end)
  48. {
  49.     T* insertPos{ begin + 1 };
  50.     for (; (insertPos != end) and (*insertPos != *(insertPos - 1)); ++insertPos);
  51.     if (insertPos == end) return end;
  52.  
  53.     begin = insertPos + 1;
  54.     while (begin != end)
  55.     {
  56.         if (*(insertPos - 1) != *begin)
  57.         {
  58.             *insertPos++ = *begin;
  59.         }
  60.         ++begin;
  61.     }
  62.     return insertPos;
  63. }
  64.  
  65. template <typename T>
  66. T* uniqualize(T* begin, T* end)
  67. {
  68.     sort(begin, end, sortUp<int>);
  69.     return unique(begin, end);
  70. }
  71.  
  72. template <typename T>
  73. T* binSearch(T* begin, T* end, const T& key)
  74. {
  75.     T* left{ begin };
  76.     T* right{ end - 1 };
  77.     T* mid;
  78.     while (true)
  79.     {
  80.         mid = left + ((right - left) / 2);
  81.         if (key == *mid) { return mid; };
  82.         if (key < *mid) { right = mid - 1; }
  83.         if (key > * mid) { left = mid + 1; }
  84.         if (left > right) { return end; };
  85.     }
  86. }
  87.  
  88. template <typename T, typename PredFunction>
  89. T* leave_if(T* begin, T* end, PredFunction pred)
  90. {
  91.     T* insertPos{ begin };
  92.     for (; (insertPos != end) and pred(*insertPos); ++insertPos);
  93.     if (insertPos == end) return end;
  94.  
  95.     begin = insertPos + 1;
  96.     while (begin != end)
  97.     {
  98.         if (pred(*begin))
  99.         {
  100.             *insertPos++ = *begin;
  101.         }
  102.         ++begin;
  103.     }
  104.     return insertPos;
  105. }
  106.  
  107. template <typename T>
  108. T* leave_if_ref(T* begin, T* end, T* beginRef, T* endRef, bool(*pred)(T*, T*, const T&))
  109. {
  110.     T* insertPos{ begin };
  111.     for (; (insertPos != end) and pred(beginRef, endRef, *insertPos); ++insertPos);
  112.     if (insertPos == end) return end;
  113.  
  114.     begin = insertPos + 1;
  115.     while (begin != end)
  116.     {
  117.         if (pred(beginRef, endRef, *begin))
  118.         {
  119.             *insertPos++ = *begin;
  120.         }
  121.         ++begin;
  122.     }
  123.     return insertPos;
  124. }
  125.  
  126. template <typename T>
  127. T* remove_if_ref(T* begin, T* end, T* beginRef, T* endRef, bool(*pred)(T*, T*, const T&))
  128. {
  129.     T* insertPos{ begin };
  130.     for (; (insertPos != end) and !pred(beginRef, endRef, *insertPos); ++insertPos);
  131.     if (insertPos == end) return end;
  132.  
  133.     begin = insertPos + 1;
  134.     while (begin != end)
  135.     {
  136.         if (!pred(beginRef, endRef, *begin))
  137.         {
  138.             *insertPos++ = *begin;
  139.         }
  140.         ++begin;
  141.     }
  142.     return insertPos;
  143. }
  144.  
  145. template <typename T>
  146. T* merge(T* beginA, T* endA, T* beginB, T* endB, T* beginDest)
  147. {
  148.     while (beginA != endA and beginB != endB)
  149.     {
  150.         *beginDest++ = *beginA < *beginB ? *beginA++ : *beginB++;
  151.     }
  152.     while (beginA != endA)
  153.     {
  154.         *beginDest++ = *beginA++;
  155.     }
  156.     while (beginB != endB)
  157.     {
  158.         *beginDest++ = *beginB++;
  159.     }
  160.     return beginDest;
  161. }
  162.  
  163. template <typename T>
  164. bool notIn(T* begin, T* end, const T& el)
  165. {
  166.     return (binSearch(begin, end, el) == end);
  167. }
  168.  
  169. template <typename T>
  170. bool isIn(T* begin, T* end, const T& el)
  171. {
  172.     return (binSearch(begin, end, el) != end);
  173. }
  174.  
  175. template <typename T>
  176. size_t distance(T* begin, T* end)
  177. {
  178.     return end - begin;
  179. }
  180.  
  181. template <typename T>
  182. T* dedup(T* begin, T* end)
  183. {
  184.     T* next{ begin };
  185.     ++next;
  186.     T* out{ begin };
  187.  
  188.     while (begin != end)
  189.     {
  190.         if (*begin != *next)
  191.         {
  192.             *out++ = *begin++;
  193.             ++next;
  194.         }
  195.         else
  196.         {
  197.             begin+=2;
  198.             next+=2;
  199.         }
  200.     }
  201.     return out;
  202. }
  203.  
  204. int main()
  205. {
  206.     const int arrASize{ 15 };
  207.     const int arrBSize{ 15 };
  208.     int arrA[arrASize] = { 6,1,4,2,8,9,11,26,2,7,8,11,2,2,3 };
  209.     int arrB[arrBSize] = { 1,8,29,2,2,9,11,1,2,5,8,34,12,9,8 };
  210.    
  211.  
  212.     print(arrA, arrA + arrASize);
  213.     print(arrB, arrB + arrBSize);
  214.     int* uniqueAPos{ uniqualize(arrA, arrA + arrASize) };
  215.     int* uniqueBPos{ uniqualize(arrB, arrB + arrBSize) };
  216.     print(arrA, uniqueAPos);
  217.     print(arrB, uniqueBPos);
  218.  
  219.     int* mergeAB{ new int[distance(arrA,uniqueAPos) + distance(arrB,uniqueBPos)] };
  220.     int* mergePos{ merge(arrA, uniqueAPos,arrB, uniqueBPos, mergeAB) };
  221.     print(mergeAB, mergePos);
  222.     int* dedupPos{ dedup(mergeAB, mergePos)};
  223.     print(mergeAB, dedupPos);
  224.  
  225.     //int* resAPos { leave_if(arrA, uniqueAPos, [arrB, uniqueBPos](int& el) {return (binSearch((int*)arrB, uniqueBPos, el) == uniqueBPos); }) };
  226.     //int* resAPos{ remove_if_ref(arrA, uniqueAPos, arrB, uniqueBPos, isIn<int>) };
  227.     //int* resAPos{ leave_if_ref(arrA, uniqueAPos, arrB, uniqueBPos, isIn<int>) };
  228.     //print(arrA, resAPos);
  229.     delete[] mergeAB;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement