我有一个浮点数向量,我将其视为二维数组,声明为
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做其他任何事情,这似乎有点过分。
由于我需要的迭代器的具体修改是如此微不足道,我想可能会有一种更简单的方法,就像有人已经制作了我需要的那种适配器?
答案 0 :(得分:1)
如果您不想使用boost
,那么执行此操作的简便方法是定义您自己的迭代器
struct col_iterator : public std::iterator<std::forward_iterator_tag, value_type>
operator++
的正文将使当前索引增加列数。
如果要首先使用列迭代单个列或整个数组,您将拥有不同的实现。