Advertisement
avr39ripe

cppArrayDiffElementOfTwoArraySTLLike

May 19th, 2021
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <typename T> bool sortUp(T a, T b)
  4. {
  5.     return a < b;
  6. }
  7.  
  8. template <typename T> bool sortDown(T a, T b)
  9. {
  10.     return a > b;
  11. }
  12.  
  13. template <typename T> void sort(T* begin, T* end, bool(*sortCrit)(T, T), void(*print)(T*, 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(T* begin, T* 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* 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* begin, T* end)
  65. {
  66.     sort(begin, end, sortUp<int>);
  67.     return unique(begin, end);
  68. }
  69.  
  70. template <typename T>
  71. T* merge(T* beginA, T* endA, T* beginB, T* endB, T* beginDest)
  72. {
  73.     while (beginA != endA and beginB != endB)
  74.     {
  75.         *beginDest++ = *beginA < *beginB ? *beginA++ : *beginB++;
  76.     }
  77.     while (beginA != endA)
  78.     {
  79.         *beginDest++ = *beginA++;
  80.     }
  81.     while (beginB != endB)
  82.     {
  83.         *beginDest++ = *beginB++;
  84.     }
  85.     return beginDest;
  86. }
  87.  
  88. template <typename T>
  89. T* dedup(T* begin, T* end)
  90. {
  91.     T* next{ begin };
  92.     ++next;
  93.     T* out{ begin };
  94.  
  95.     while (begin != end)
  96.     {
  97.         if (*begin != *next)
  98.         {
  99.             *out++ = *begin++;
  100.             ++next;
  101.         }
  102.         else
  103.         {
  104.             begin += 2;
  105.             next += 2;
  106.         }
  107.     }
  108.     return out;
  109. }
  110. template <typename T>
  111. size_t distance(T* begin, T* end)
  112. {
  113.     return end - begin;
  114. }
  115.  
  116. template <typename T>
  117. size_t copy(T* srcB, T* srcE, T* destB, T* destE)
  118. {
  119.     size_t copyCount{ 0 };
  120.     while (destB != destE and srcB != srcE)
  121.     {
  122.         *destB++ = *srcB++;
  123.         ++copyCount;
  124.     }
  125.     return copyCount;
  126. }
  127.  
  128. int* createArr(size_t size)
  129. {
  130.     return new int[size];
  131. }
  132.  
  133. void deleteArr(int* ptr)
  134. {
  135.     delete[] ptr;
  136. }
  137.  
  138. int main()
  139. {
  140.     const int arrASize{ 15 };
  141.     const int arrBSize{ 15 };
  142.     int arrA[arrASize] = { 6,1,4,2,8,9,11,26,2,7,8,11,2,2,3 };
  143.     int arrB[arrBSize] = { 1,8,29,2,2,9,11,1,2,5,8,34,12,9,8 };
  144.  
  145.     std::cout << "Original arrays:\n";
  146.     print(arrA, arrA + arrASize);
  147.     print(arrB, arrB + arrBSize);
  148.  
  149.     int* uniqueAPos{ uniqualize(arrA, arrA + arrASize) };
  150.     int* uniqueBPos{ uniqualize(arrB, arrB + arrBSize) };
  151.  
  152.     int* mergeAB{ createArr(distance(arrA,uniqueAPos) + distance(arrB,uniqueBPos)) };
  153.     int* mergePos{ merge(arrA, uniqueAPos,arrB, uniqueBPos, mergeAB) };
  154.     //std::cout << "\nMerged elements of two arrays:\n";
  155.     //print(mergeAB, mergePos);
  156.     int* dedupPos{ dedup(mergeAB, mergePos) };
  157.     //std::cout << "\nDifferent elements of two arrays without duplicates:\n";
  158.     //print(mergeAB, dedupPos);
  159.  
  160.     auto arrCSize{ distance(mergeAB, dedupPos) };
  161.     auto arrC{ createArr(arrCSize) };
  162.     copy(mergeAB, dedupPos, arrC, arrC + arrCSize);
  163.     std::cout << "\nDifferent elements of two arrays without duplicates:\n";
  164.     print(arrC, arrC + arrCSize);
  165.  
  166.     deleteArr(mergeAB);
  167.     deleteArr(arrC);
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement