Advertisement
avr39-ripe

arr2dDynPracticeBBV192

Apr 21st, 2020
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. T** createArr2d(int ySize, int xSize)
  5. {
  6.     T** arr2d{ new T* [ySize] };
  7.     for (int y{ 0 }; y < ySize; ++y)
  8.     {
  9.         arr2d[y] = new T[xSize]{};
  10.     }
  11.     return arr2d;
  12. }
  13.  
  14. template <typename T>
  15. void deleteArr2d(T** arr2d, int ySize)
  16. {
  17.     for (int y{ 0 }; y < ySize; ++y)
  18.     {
  19.         delete[] arr2d[y];
  20.     }
  21.     delete[] arr2d;
  22. }
  23.  
  24. template <typename T>
  25. void printArr2d(T** arr2d, int ySize, int xSize)
  26. {
  27.     for (int y{ 0 }; y < ySize; ++y)
  28.     {
  29.         for (int x{ 0 }; x < xSize; ++x)
  30.         {
  31.             std::cout << arr2d[y][x] << '\t';
  32.         }
  33.         std::cout << '\n';
  34.     }
  35.     std::cout << '\n';
  36. }
  37.  
  38. template <typename T>
  39. void fillArr2d(T** arr2d, int ySize, int xSize)
  40. {
  41.     for (int y{ 0 }; y < ySize; ++y)
  42.     {
  43.         for (int x{ 0 }; x < xSize; ++x)
  44.         {
  45.             arr2d[y][x] = rand() % 20;
  46.         }
  47.     }
  48. }
  49.  
  50. //template <typename T>
  51. //void deleteLastLine2dArr(T**& arr2d, int& ySize)
  52. //{
  53. //  delete[] arr2d[ySize - 1];
  54. //  T** tmp = new T* [--ySize];
  55. //  for (int y{ 0 }; y < ySize; ++y)
  56. //  {
  57. //      tmp[y] = arr2d[y];
  58. //  }
  59. //  delete[] arr2d;
  60. //  arr2d = tmp;
  61. //}
  62.  
  63. template <typename T>
  64. void deleteLine2dArr(T**& arr2d, int& ySize, int lineIdx)
  65. {
  66.     delete[] arr2d[lineIdx];
  67.     T** tmp = new T * [--ySize];
  68.     for (int y{ 0 }; y < ySize; ++y)
  69.     {
  70.         y < lineIdx ? tmp[y] = arr2d[y] : tmp[y] = arr2d[y + 1];
  71.     }
  72.     delete[] arr2d;
  73.     arr2d = tmp;
  74. }
  75.  
  76. template <typename T>
  77. void deleteLastLine2dArr(T**& arr2d, int& ySize)
  78. {
  79.     deleteLine2dArr(arr2d, ySize, ySize - 1);
  80. }
  81.  
  82. template <typename T>
  83. void deleteFirstLine2dArr(T**& arr2d, int& ySize)
  84. {
  85.     deleteLine2dArr(arr2d, ySize, 0);
  86. }
  87.  
  88. template <typename T>
  89. void addColArr2d(T** arr2d, int ySize, int& xSize, int colPos, T* newCol = nullptr)
  90. {
  91.     T* newRow;
  92.     for (int y{ 0 }; y < ySize; ++y)
  93.     {
  94.         newRow = new T[xSize + 1]{};
  95.         /*      colPos = 2;
  96.               1 2 3 4 5
  97.               1 2 0 3 4 5*/
  98.         for (int x{ 0 }; x < xSize; ++x)
  99.         {
  100.             newRow[x + (x < colPos ? 0 : 1)] = arr2d[y][x];
  101.         }
  102.         if (newCol) { newRow[colPos] = newCol[y]; };
  103.         delete[] arr2d[y];
  104.         arr2d[y] = newRow;
  105.     }
  106.     ++xSize;
  107. }
  108.  
  109. template <typename T>
  110. void sliceArr2d(T** arr2d, int ySize, int xSize, T* bigArr)
  111. {
  112.     for (int y{ 0 }; y < ySize; ++y)
  113.     {
  114.         arr2d[y] = bigArr + y * xSize;
  115.     }
  116. }
  117.  
  118. template <typename T>
  119. T** createArr2dLinear(int ySize, int xSize)
  120. {
  121.     T** arr2d{ new T * [ySize] };
  122.     T* bigArr{ new T[ySize * xSize] {} };
  123.     sliceArr2d(arr2d, ySize, xSize, bigArr);
  124.     return arr2d;
  125. }
  126.  
  127. template <typename T>
  128. void deleteArr2dLinear(T** arr2d)
  129. {
  130.     delete[] arr2d[0];
  131.     delete[] arr2d;
  132. }
  133.  
  134. template <typename T>
  135. void addColArr2dLinear(T** arr2d, int ySize, int& xSize, int colPos, T* newCol = nullptr)
  136. {
  137.     T* newBigArr{ new int[ySize * (xSize + 1)]{} };
  138.  
  139.     for (int y{ 0 }; y < ySize; ++y)
  140.     {
  141.         for (int x{ 0 }; x < xSize; ++x)
  142.         {
  143.             //newRow[                       x + (x < colPos ? 0 : 1)] = arr2d[y][x];
  144.             newBigArr[y * (xSize + 1) + x + (x < colPos ? 0 : 1)] = arr2d[y][x];
  145.         }
  146.         if (newCol)
  147.         {
  148.             newBigArr[y * (xSize + 1) + colPos] = newCol[y];
  149.         }
  150.     }
  151.  
  152.     xSize++;
  153.     delete[] arr2d[0];
  154.     sliceArr2d(arr2d, ySize, xSize, newBigArr);
  155. }
  156.  
  157. int main()
  158. {
  159.     int ySzie{ 3 };
  160.     int xSize{ 3 };
  161.  
  162.     //int** arr2d{ createArr2d<int>(ySzie,xSize) };
  163.     //printArr2d(arr2d, ySzie, xSize);
  164.  
  165.     //fillArr2d(arr2d, ySzie, xSize);
  166.     //printArr2d(arr2d, ySzie, xSize);
  167.     //
  168.     //int* newCol{ new int[ySzie] {11,12,13} };
  169.     //addColArr2d(arr2d, ySzie, xSize, 1, newCol);
  170.     //printArr2d(arr2d, ySzie, xSize);
  171.  
  172.     //deleteLine2dArr(arr2d, ySzie, 1);
  173.     //printArr2d(arr2d, ySzie, xSize);
  174.  
  175.     //deleteArr2d(arr2d, ySzie);
  176.     //delete[] newCol;
  177.  
  178.  
  179.     int** arr2d{ createArr2dLinear<int>(ySzie,xSize) };
  180.     printArr2d(arr2d, ySzie, xSize);
  181.  
  182.     fillArr2d(arr2d, ySzie, xSize);
  183.     printArr2d(arr2d, ySzie, xSize);
  184.  
  185.     int* newCol{ new int[ySzie] {11,12,13} };
  186.     addColArr2dLinear(arr2d, ySzie, xSize, 1, newCol);
  187.     printArr2d(arr2d, ySzie, xSize);
  188.  
  189.     deleteArr2dLinear(arr2d);
  190.     delete[] newCol;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement