Tim*_*imo 6 c++ arrays boost iterator stl
我有一个浮动向量,我将其视为2D数组,声明为
std::vector<float> vec(height*width);
Run Code Online (Sandbox Code Playgroud)
我正在处理的数值问题需要在行和列中处理相同的算法,所以我希望能够通过迭代器编写它们,并且只需输入行迭代器或列迭代器.
为了澄清,这里是访问数组的指针算术版本:
valueatxy = vec[y*width + x];
Run Code Online (Sandbox Code Playgroud)
行迭代器形式当然是微不足道的,比方说我有一个函数template<class iter> void process(iter begin, iter end),调用是
process(vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)
现在为了能够使用相同的函数进行列操作,我需要一个列迭代器.这与通常的向量迭代器基本上是相同的迭代器,除了增量运算符和所有其他类似指针算术的运算符,以宽度的倍数递增.电话应该是这样的
process(columnit(vec.begin() + x, width),
columnit(vec.begin() + x + width, width));
Run Code Online (Sandbox Code Playgroud)
columnit列迭代器类在哪里构造,以按宽度步长递增底层迭代器.
现在,我的问题是,定义这样一个修改过的迭代器的最简单方法是什么?从头开始定义一个新的迭代器涉及很多样板,至少如果我希望它甚至是远程stl兼容的话.Boost迭代器适配器旨在帮助解决这个问题,而且它显然是一个选项,但由于我认为我不需要Boost做其他任何事情,这似乎有点过分.
由于我需要的迭代器的具体修改是如此微不足道,我想可能会有一个更简单的方法,就像有人已经制作了我需要的那种适配器?
如果您不想使用boost,最简单的方法是定义您自己的迭代器
struct col_iterator : public std::iterator<std::forward_iterator_tag, value_type>
Run Code Online (Sandbox Code Playgroud)
并且主体operator++将按列数增加当前索引。
如果您想迭代单个列或以列为先的整个数组,您将有不同的实现。