【问题标题】:Iterate Through Row Major-Stored Array in Column Major Order按列主要顺序遍历行主要存储的数组
【发布时间】:2012-12-20 21:33:57
【问题描述】:

我正在研究一个多维数组类(省略了复杂/不相关的细节)。我将数据存储为以行主要顺序存储的线性数组。我需要创建一个迭代器,它可以按列优先顺序迭代数组。鉴于数据以行主要顺序存储,行主要迭代器可以简单地将索引递增到数组中。但是,我不确定如何实现列主迭代器。我猜有一个公式可以用来计算索引,但无法在任何地方找到它或自己推导出它。重新排列数据不是一种选择,因为无论我需要两个迭代器。

【问题讨论】:

  • i = n; i < length; i += row_length
  • 这些都不是遍历数组,只是其元素的一个子集。
  • 是的,它只会遍历一个子集。我确实有可用的数组维度。

标签: c++ arrays


【解决方案1】:
last_idx = width * height - 1;

if(pos == last_idx)
{
    end;
}
else {
    pos += width;
    if(pos > last_idx) pos -= last_idx;
}

【讨论】:

  • 这假设它是一个二维数组,不是吗?对于更高维度的数组,你会怎么做?
【解决方案2】:
// Example
const int ROWS = 4;
const int COLS = 5;

// Initial
int row = 0;
int col = 0;

// Iteration
row += 1;
col += row / ROWS;
row %= ROWS;

// Index into your array
row * ROWS + col

// Termination
row * ROWS + col < ROWS * COLS

【讨论】:

  • 这确实——我真的只使用 const 来表示迭代时尺寸没有变化——这将不可避免地破坏任何迭代。
  • 我的意思是,例如,它需要使用 2x3x4x5 数组。所以可能不仅仅是行和列。
  • 这个想法还是一样的,只是在第 3 维的完整迭代中,有条件地增加 row 和 col 等等。你可以在内部维度上使用相同的 mod / 技巧.
  • @AnthonySottile,不清楚您所说的“仅在第三维的完整迭代等条件下增加行和列”是什么意思。您能以某种方式将其应用于代码吗?另外,如果您在编写代码时不知道维数怎么办?如果你只知道会有一个包含数组维度的向量呢?
  • 如果您的尺寸是(3, 4, 5),则您将通过5 对内部行进行 mod/div,对下一组行进行 mod/div by 4 * 5,等等。跨度>
【解决方案3】:

给定数组的维度,您可以创建映射表并让迭代器对其进行迭代。

array[mapping_table[i]]

【讨论】:

  • 您将如何创建映射表?它会是什么样子?如果你举个例子,请确保它不是特定于二维数组。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多