【发布时间】:2020-06-01 08:06:02
【问题描述】:
我正在尝试以特定顺序迭代整数的一维数组/向量,但我无法绕开它来获得正确的循环条件。
输入数据是整数的一维向量:
{1, 5, 9, 13, 17, 21, 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23, 4, 8, 12, 16, 20, 24, 25, 29, 33, 37, 41, 45, 26, 30, 34, 38, 42, 46, 27, 31, 35, 39, 43, 47, 28, 32, 36, 40, 44, 48}
此输入数据本质上是具有子组的二维数组/网格的一维表示:
+----+----+----+----+----+----+
| 1 | 5 | 9 | 13 | 17 | 21 |
+----+----+----+----+----+----+
| 2 | 6 | 10 | 14 | 18 | 22 |
+----+----+----+----+----+----+
| 3 | 7 | 11 | 15 | 19 | 23 |
+----+----+----+----+----+----+
| 4 | 8 | 12 | 16 | 20 | 24 |
+----+----+----+----+----+----+
| 25 | 29 | 33 | 37 | 41 | 45 |
+----+----+----+----+----+----+
| 26 | 30 | 34 | 38 | 42 | 46 |
+----+----+----+----+----+----+
| 27 | 31 | 35 | 39 | 43 | 47 |
+----+----+----+----+----+----+
| 28 | 32 | 36 | 40 | 44 | 48 |
+----+----+----+----+----+----+
此表被分组为多个 2x4 子组:
我想按照数字指示的顺序迭代这个 1D 输入向量/数组。 (基本上是通过每个 2x4 子组,一个接一个)。 在循环内部,我想将当前处理的子组的 8 个元素加载到 vector/int 中以供进一步处理。 所以最后我应该处理 6 个子组,第一个持有数字 1 到 8,第二个持有数字 9 到 16,所以第四个.. 应该从左到右处理组。
注意:输入数据中的数字仅作为示例,以明确数据的处理顺序。输入数据可能包含完全随机的值。应保持每组中值的顺序。组内不应该有排序/重新排序。重要的是子组/数组维度等的约束。
连同一维数组/向量,我确实知道网格的尺寸和子组的大小:
int grid_width = 6; // Variable, but will always be a multiple of 2, to match subgroup width
int grid_height = 8; // Variable, but will always be a multiple of 4, to match subgroup height
const int group_width = 2; // Constant, subgroup width is always 2.
const int group_height = 4; // Constant, subgroup height is always 4.
我的想法是有一个循环遍历整个数据,然后有两个循环相应地处理子组。但我真的很难让元素的循环条件和索引正确。我的思考过程是这样的:
// Iterate over entire data
for (int i = 0; i < grid_width * grid_height; i += (group_width * group_height))
{
int block[8];
// Iterate groups in correct order
for (int j = 0; j < group_height; j++)
{
for (int k = 0; k < group_width; k++)
{
// Grab current element in group
int value = input_array[i * grid_width + j]; // ?? This ain't right
// Add element to group array/vector
block[??] = ??;
}
}
// Do further processing with the group array
}
有人可以帮我正确循环吗? 我希望这个问题足够清楚。如果没有,请告诉我。
【问题讨论】:
-
您可以创建另一个数组(或向量),其中包含您想要的索引顺序。例如,如果可以像
{ 0, 6, 12, ... etc }一样开始。有了这个,您应该很快就会开始看到一种模式正在出现,这意味着您可以在运行时根据您拥有的有关矩阵和子矩阵的信息创建这个索引向量。 -
如果您可以添加要为每个组处理的值的示例,问题会更清楚。
-
@alaniwi 提到了。第一组将包含值 1 到 8,第二组将包含值 9 到 16,第三组 17 到 24,第四组 25 到 32 等等......
-
@Kyu96 是的,但我的意思是您所说的“值 1 到 8”的示例。显然,在第一次迭代时输出值
1, 2, 3, 4, 5, 6, 7, 8、在第二次迭代时输出数字9, 10, 11, 12, 13, 14, 15, 16等的程序是微不足道的。 -
@alaniwi 这些数字应该清楚地表明我要处理数据的顺序。数字本身可以有任何值,并且不应该与迭代过程相关。我更新了问题,希望现在更清楚了。
标签: c++ arrays vector data-structures