Advertisement
avr39ripe

arr2dDynLinear

Jan 14th, 2021 (edited)
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 KB | None | 0 0
  1. // https://pastebin.com/edit/xNwQPu8P - separate new for each row version
  2. #include <iostream>
  3.  
  4. int index2D(int y, int x, int xSize)
  5. {
  6.     return x + y * xSize;
  7. }
  8.  
  9. template <typename T>
  10. void printArr(T* arr, int arrSize)
  11. {
  12.     for (int i{ 0 }; i < arrSize; ++i)
  13.     {
  14.         std::cout << arr[i] << '\t';
  15.     }
  16.     std::cout << '\n';
  17. }
  18.  
  19. template <typename T>
  20. void printArr(T** container, int ySize, int xSize)
  21. {
  22.     for (int y{ 0 }; y < ySize; ++y)
  23.     {
  24.         printArr(container[y], xSize);
  25.     }
  26.     std::cout << '\n';
  27. }
  28.  
  29. template <typename T>
  30. void fillArr(T** container, int ySize, int xSize)
  31. {
  32.     int cnt{ 1 };
  33.     for (int y{ 0 }; y < ySize; ++y)
  34.     {
  35.         for (int x{ 0 }; x < xSize; ++x)
  36.         {
  37.             container[y][x] = cnt++;
  38.         }
  39.     }
  40. }
  41.  
  42. template <typename T>
  43. void sliceBigArr(T** container, T* bigArr, int ySize, int xSize)
  44. {
  45.     for (int y{ 0 }; y < ySize; ++y)
  46.     {
  47.         container[y] = bigArr + xSize * y;
  48.     };
  49. }
  50.  
  51. template <typename T>
  52. T** createArr2DLinear(int ySize, int xSize)
  53. {
  54.     T** container{ new T * [ySize] };
  55.     T* bigArr{ new T[ySize * xSize] };
  56.     sliceBigArr(container, bigArr, ySize, xSize);
  57.     return container;
  58. }
  59.  
  60. template <typename T>
  61. void deleteArr2DLinear(T** container)
  62. {
  63.     delete[] *container;
  64.     delete[] container;
  65. }
  66.  
  67. template <typename T>
  68. void deleteColumnArr2DLinear(T** container, int ySize, int& xSize, int columnPos)
  69. {
  70.     --xSize;
  71.     T* newBigArr{ new T[ySize * xSize] };
  72.     T* oldBigArr{ *container };
  73.     for (int y{ 0 }; y < ySize; ++y)
  74.     {
  75.         for (int x{ 0 }; x < xSize; ++x)
  76.         {
  77.             //newBigArr[x + xSize*y] = container[y][x + (x >= columnPos)];
  78.             *(newBigArr + index2D(y,x,xSize)) = *(oldBigArr + index2D(y, x + (x >= columnPos), xSize));
  79.         }
  80.  
  81.     }
  82.     delete[] oldBigArr;
  83.     sliceBigArr(container, newBigArr, ySize, xSize);
  84. }
  85.  
  86. template <typename T>
  87. void addColumnArr2DLinear(T** container, int ySize, int& xSize, int columnPos, T* newCol = nullptr)
  88. {
  89.     T* newBigArr{ new T[ySize * (xSize + 1)] };
  90.     T* oldBigArr{ *container };
  91.     for (int y{ 0 }; y < ySize; ++y)
  92.     {
  93.         for (int x{ 0 }; x < xSize; ++x)
  94.         {
  95.             //newBigArr[x + (xSize + 1) * y + (x >= columnPos)] = container[y][x];
  96.             *(newBigArr + index2D(y, x + (x >= columnPos), xSize + 1)) = *(oldBigArr + index2D(y,x,xSize));
  97.         }
  98.  
  99.         //newBigArr[y * (xSize + 1) + columnPos] = newCol ? newCol[y] : 0;
  100.         *(newBigArr + y * (xSize + 1) + columnPos) = newCol ? *(newCol + y) : 0;
  101.  
  102.     }
  103.     delete[] oldBigArr;
  104.     ++xSize;
  105.     sliceBigArr(container, newBigArr, ySize, xSize);
  106. }
  107.  
  108. template <typename T>
  109. void deleteRowArr2DLinear(T**& container, int& ySize, int xSize, int rowPos)
  110. {
  111.     --ySize;
  112.     T* newBigArr{ new T[ySize*xSize] };
  113.     T* oldBigArr{ *container };
  114.     for (int y{ 0 }; y < ySize; ++y)
  115.     {
  116.         for (int x{ 0 }; x < xSize; ++x)
  117.         {
  118.             //newBigArr[x + (xSize)*y] = container[y + (y >= rowPos)][x];
  119.             *(newBigArr + index2D(y,x,xSize)) = *(oldBigArr + index2D(y + (y >= rowPos),x,xSize));
  120.         }
  121.  
  122.     }
  123.     deleteArr2DLinear(container);
  124.     container = new T * [ySize];
  125.     sliceBigArr(container, newBigArr, ySize, xSize);
  126. }
  127.  
  128. template <typename T>
  129. void addRowArr2DLinear(T**& container, int& ySize, int xSize, int rowPos, T* newRow = nullptr)
  130. {
  131.     T* newBigArr{ new T[(ySize + 1) * xSize]};
  132.     T* oldBigArr{ *container };
  133.     for (int y{ 0 }; y < ySize; ++y)
  134.     {
  135.         for (int x{ 0 }; x < xSize; ++x)
  136.         {
  137.             //newBigArr[x + (xSize) * (y + (y >= rowPos))] = container[y][x];
  138.             *(newBigArr + index2D(y + (y >= rowPos),x,xSize)) = *(oldBigArr + index2D(y,x,xSize));
  139.         }
  140.     }
  141.     for (int x{ 0 }; x < xSize; ++x)
  142.     {
  143.         //newBigArr[x + (xSize)*rowPos] = newRow ? newRow[x] : 0;
  144.         *(newBigArr + x + xSize * rowPos) = newRow ? *(newRow + x) : 0;
  145.     }
  146.     deleteArr2DLinear(container);
  147.     ++ySize;
  148.     container = new T * [ySize];
  149.     sliceBigArr(container, newBigArr, ySize, xSize);
  150. }
  151.  
  152. int main()
  153. {
  154.     int ySize{ 3 };
  155.     int xSize{ 3 };
  156.     auto arr2D{ createArr2DLinear<int>(ySize,xSize) };
  157.  
  158.     fillArr(arr2D, xSize, ySize);
  159.     printArr(arr2D, ySize, xSize);
  160.  
  161.     deleteColumnArr2DLinear(arr2D, ySize, xSize, 2);
  162.     printArr(arr2D, ySize, xSize);
  163.  
  164.     auto newCol{ new int[ySize] {1,2,3} };
  165.     addColumnArr2DLinear(arr2D, ySize, xSize, 0, newCol);
  166.     printArr(arr2D, ySize, xSize);
  167.  
  168.     deleteRowArr2DLinear(arr2D, ySize, xSize, 2);
  169.     printArr(arr2D, ySize, xSize);
  170.  
  171.     auto newRow{ new int[xSize] {1,2,3} };
  172.     addRowArr2DLinear(arr2D, ySize, xSize, 2, newRow);
  173.     printArr(arr2D, ySize, xSize);
  174.  
  175.     deleteArr2DLinear(arr2D);
  176.  
  177.     delete[] newCol;
  178.     delete[] newRow;
  179.     return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement