если у меня есть std::array<std::array<int, 4>, 4> mydata
Как бы я разделить это на более мелкие куски или std::array<std::array<int, 2>, 2>
так это будет выглядеть (визуально):
где каждый цвет один std::array<std::array<int, 2>, 2>
?
Я прочитал несколько вопросов, но они не всегда задают то же самое или являются неполными:
Разбить массив на куски в C / C ++ — спрашивает, как разбить один непрерывный поток данных на более мелкие непрерывные биты, одномерные
Разделить изображение на части размером 64×64 — источник или объяснение не предоставлено ProcessChunk
?
То, как я бы это сделал, не расщепление изображения на всех.
позвольте мне уточнить:
если вы создаете новые массивы, вам придется копировать массивы поверх какой-то новой структуры, возможно, std :: vectors, поскольку вы не знаете разных размеров во время компиляции.
Вместо этого вы можете сохранить первоначальную структуру и иметь вектор областей, где область описывается четырьмя вершинами, которые описывают ваш внутренний квадрат.
struct Area{
std::pair<int,int> topleft;
std::pair<int,int> topright;
std::pair<int,int> bottomleft;
std::pair<int,int> bottomright;
};
vector<Area> areas;
areas.emplace_back({0,0},{0,2},{2,0},{2,2});
Если вам нужно использовать меньше информации, вы можете сохранить только два угла и вычислить два других, вам нужно всего 4 дюйма, чтобы узнать область.
Напишите свою собственную функцию, чтобы сделать это. Это довольно просто, что-то вроде:
Array3D splitArray(Array2D inArray, uint rows, uint cols)
{
//Check if the array size are > 0, skipping this to save time
//Check if the arrays
size_t inSize1 = inArray.size();
size_t inSize2 = inArray[0].size();
if rows > inSize1 || colus > inSize2 || inSize1 % rows != 0 || inSize2 % cols != 0
{
//throw an exception
}
//The arrays split requested is OK, copy the data:
//Loop over the inArray and copy the appropriate cells in a temp 2D array
//then add that to an array of 2D arrays:
std::Array<Array2D> results;
return results;
}