avr39-ripe

diffElemOfTwoArrTemplate

Aug 13th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <functional>
  3.  
  4. template <typename T> int sortUp(T a, T b)
  5. {
  6.     return a < b;
  7. }
  8.  
  9. template <typename T> int sortDown(T a, T b)
  10. {
  11.     return a > b;
  12. }
  13.  
  14. template <typename T> void arrPrint(T* arr, int arrSize)
  15. {
  16.     for (int i = 0; i < arrSize; i++) { std::cout << arr[i] << " "; }; std::cout << '\n';
  17. }
  18.  
  19. template <typename T> void sortArr(T* arr, int arrSize, std::function<int(T, T)> sortCrit, std::function<void(T*, int)> print=nullptr)
  20. {
  21.     if (print) print(arr, arrSize);
  22.     for (int head = 0; head < arrSize; head++)
  23.     {
  24.         for (int tail = arrSize - 1; tail > head; tail--)
  25.         {
  26.  
  27.             if (sortCrit(arr[tail],arr[head]))
  28.             {
  29.                 T tmp = arr[tail];
  30.                 arr[tail] = arr[head];
  31.                 arr[head] = tmp;
  32.  
  33.                 if (print) print(arr, arrSize);
  34.             }
  35.         }
  36.  
  37.     }
  38.     if (print) print(arr, arrSize);
  39. }
  40.  
  41. template <typename T> T* uniqArr(T* arr, int arrSize, int& uniqSize, std::function<void(T*, int)> print=nullptr)
  42. {
  43.     sortArr<T>(arr, arrSize, sortUp<T>);
  44.     uniqSize = 1;
  45.     for (int head = 1; head < arrSize; head++)
  46.     {
  47.         uniqSize+=(arr[head] != arr[head-1]);
  48.     }
  49.     T* uniqArr = new T[uniqSize];
  50.  
  51.     uniqArr[0] = arr[0];
  52.     for (int orig = 1, uniq = 1; orig < arrSize; orig++)
  53.     {
  54.         if (arr[orig] != arr[orig-1])
  55.         {
  56.             uniqArr[uniq++] = arr[orig];
  57.         }
  58.     }
  59.     if (print) print(uniqArr, uniqSize);
  60.  
  61.     return uniqArr;
  62.  
  63. }
  64.  
  65. template <typename T> int binSearch(T* arr, int arrSize, T key)
  66. {
  67.     int left = 0, right = arrSize - 1, mid=0;
  68.     while(1)
  69.     {
  70.         mid = (left + right) / 2;
  71.         if (key == arr[mid]) { return mid;};
  72.         if (key < arr[mid]) { right = mid - 1;}
  73.         if (key > arr[mid]) { left = mid + 1;}
  74.         if (left > right) { return -1; };
  75.     }
  76. }
  77.  
  78. template <typename T> T* intersectArr(T* arrA, int arrASize, T* arrB, int arrBSize, int& resSize, std::function<void(T*, int)> print=nullptr)
  79. {
  80.     int uniqSizeA = 0;
  81.     int uniqSizeB = 0;
  82.  
  83.     auto uniqArrA = uniqArr<T>(arrA,arrASize, uniqSizeA, print);
  84.     auto uniqArrB = uniqArr<T>(arrB,arrBSize, uniqSizeB, print);
  85.  
  86.     T* resArr = new T[uniqSizeA + uniqSizeB];
  87.     resSize = 0;
  88.  
  89.     for (int i=0; i<uniqSizeA; i++)
  90.     {
  91.         if (binSearch(uniqArrB, uniqSizeB, uniqArrA[i]) == -1)
  92.         {
  93.             resArr[resSize++] = uniqArrA[i];
  94.         }
  95.     }
  96.  
  97.     for (int i=0; i<uniqSizeB; i++)
  98.     {
  99.         if (binSearch(uniqArrA, uniqSizeA, uniqArrB[i]) == -1)
  100.         {
  101.             resArr[resSize++] = uniqArrB[i];
  102.         }
  103.     }
  104.  
  105.     T* tmpArr = new T[resSize];
  106.     for (int i=0; i<resSize; i++)
  107.     {
  108.         tmpArr[i]=resArr[i];
  109.     }
  110.  
  111.     delete[] resArr;
  112.     resArr = tmpArr;
  113.  
  114.     sortArr<T>(resArr, resSize, sortUp<T>);
  115.  
  116.     if (print) print(resArr, resSize);
  117.  
  118.     delete[] uniqArrA;
  119.     delete[] uniqArrB;
  120.  
  121.     return resArr;
  122. }
  123.  
  124. int main()
  125. {
  126.     int resSize = 0;
  127.  
  128.     int arrA[] = { 6,1,4,2,8,9,11,26,2,7,8,11,2,2,3 };
  129.     int arrB[] = { 1,8,29,2,2,9,11,1,2,5,8,34,12,9,8 };
  130.  
  131.  
  132.     auto resArr = intersectArr<int>(arrA, sizeof(arrA)/sizeof(int), arrB,sizeof(arrB)/sizeof(int), resSize);
  133.  
  134.     arrPrint<int>(resArr, resSize);
  135.  
  136.     delete[] resArr;
  137.  
  138. }
Add Comment
Please, Sign In to add comment