2D数组C++的列迭代器
Column iterators for a 2D array 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++
的正文将使当前索引增加列数。
如果您想在单个列或整个数组上以列为先进行迭代,则会有不同的实现。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?