2D数组C++的列迭代器



我有一个浮点向量,我将其视为2D数组,声明为

std::vector<float> vec(height*width);

我正在处理的数值问题需要用相同的算法在行和列中进行处理,所以我希望能够通过迭代器编写它们,并根据需要输入行迭代器或列迭代器。

为了澄清,这里是访问数组的指针算术版本:

valueatxy = vec[y*width + x];

行迭代器的形式当然是琐碎的,比如说我有一个函数template<class iter> void process(iter begin, iter end),调用是

process(vec.begin(), vec.end());

现在,为了能够对列操作使用相同的函数,我需要一个列迭代器。这与通常的向量迭代器本质上是相同的迭代器,不同之处在于增量运算符和所有其他类似指针算术的运算符都是以宽度的倍数递增的。电话应该像一样

process(columnit(vec.begin() + x, width),
columnit(vec.begin() + x + width, width));

其中columnit是列迭代器类,构造为按宽度步长递增底层迭代器。

现在,我的问题是,定义这样一个修改后的迭代器最简单的方法是什么?从头开始定义一个新的迭代器需要大量的样板,至少如果我想让它与stl远程兼容的话。Boost迭代器适配器是为了帮助实现这一点而设计的,它显然是一个选项,但由于我认为我不需要Boost来做任何其他事情,这似乎有点过头了。

由于我需要对迭代器进行的特定修改非常琐碎,我想会有一种更简单的方法,比如可能有人已经制作了我需要的适配器?

如果您不想使用boost,最简单的方法是定义自己的迭代器

struct col_iterator : public std::iterator<std::forward_iterator_tag, value_type>

operator++的正文将使当前索引增加列数。

如果您想在单个列或整个数组上以列为先进行迭代,则会有不同的实现。

最新更新