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

时间:2014-02-25 13:25:49

标签: c++ arrays boost stl iterator

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

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做其他任何事情,这似乎有点过分。

由于我需要的迭代器的具体修改是如此微不足道,我想可能会有一种更简单的方法,就像有人已经制作了我需要的那种适配器?

1 个答案:

答案 0 :(得分:1)

如果您不想使用boost,那么执行此操作的简便方法是定义您自己的迭代器

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

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

如果要首先使用列迭代单个列或整个数组,您将拥有不同的实现。

相关问题