在Boost多重数组视图上迭代
Iterating over a Boost multi_array view
是否有方法将视图的所有元素迭代为Boostmulti_array
?很清楚如何在Boostmulti_array
上进行迭代;即越过范围CCD_ 3。但是,如果我在这个数组中创建一个视图(去掉数组的某个子集),显然使用指针进行连续访问是不可能的:视图将不对应于任何连续的内存块。Boost是否提供了一种处理此问题的机制,或者我是否需要手动实现解决方案?
不幸的是,Boost.MA没有提供对视图的所有元素进行一般迭代的方法。正如burnpanck所说,然而,你在步幅信息中拥有所有必要的信息,尽管这会打破抽象。
有很多方法可以遍历元素,但您没有指定它(例如,规范顺序或前导轴优先),但是,您可以从下面的示例中了解如何迭代所有元素:https://www.boost.org/doc/libs/1_79_0/libs/multi_array/example/print_array.cpp这种技术需要某种(模板)递归,终止于较低维度。
在不太担心性能或细节的情况下,技术如下。
template<class Array, ElementAction action>
void for_each_element(Array&& arr, ElementAction const& action) {
for(long i = 0; i != arr.size(); ++i) {
if constexpr(std::decay_t<Array>::dimensionality != 1) {
for_each_element(arr[i], action);
} else {
action(arr[i]);
}
}
}
用作
V = ... array view ..
for_each_element(V, [](auto& e) {e += 1;});
我已经编写了一个单独的多维数组库,它作为一个特殊的访问器;线性化的";元素。
V = ...; // a view
...
for(auto& e : V.elements()) { // V.elements() has begin() and end()
e += 1; // for example
}
它将以任意维度的正则顺序覆盖V
,即使V
是具有非平凡步长的视图。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 迭代时从向量和内存中删除对象
- 如何在c++迭代器类型中包装std::chrono
- 带过滤器的现代迭代c++集合
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- C++矢量迭代
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 擦除while循环中迭代的元素
- 实现一个在集合上迭代的模板函数
- 对于set上的循环-获取next元素迭代器
- 在向量内的向量上迭代
- 为什么output_editor Concept不需要output_e迭代器标记
- TSP递归解的迭代形式
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在Boost多重数组视图上迭代
- 规则迭代器(或类似的范围/视图类)是否应从const_iterator派生
- 公开私人作用域Boost.BiMap迭代器的公共视图