在Boost多重数组视图上迭代

Iterating over a Boost multi_array view

本文关键字:视图 迭代 数组 Boost      更新时间:2023-10-16

是否有方法将视图的所有元素迭代为Boostmulti_array?很清楚如何在Boostmulti_array上进行迭代;即越过范围CCD_ 3。但是,如果我在这个数组中创建一个视图(去掉数组的某个子集),显然使用指针进行连续访问是不可能的:视图将不对应于任何连续的内存块。Boost是否提供了一种处理此问题的机制,或者我是否需要手动实现解决方案?

幸运的是,multi_array概念不需要任何连续的内存块。引用实现为每个维度存储一个步长,这一事实提供了足够的信息来正确地在视图上迭代。事实上,multi_array概念要求返回的视图像标准容器一样是可迭代的。

不幸的是,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是具有非平凡步长的视图