Boost :: multi_array looping

I looked at this post that describes how to iterate over arrays that are not based on a zero value using boost::multi_array::origin() , but this only creates a single loop.

How does each multi_array size multi_array , for example:

 for(index i = <origin of dim 1>; ...) { for(index j = <origin of dim 2>; ...) { for(index k = <origin of dim 3>; ...) { myArray[i][j][k] = <something>; } } } 

when an array is given, where are the upper and lower bounds unknown?

+4
source share
1 answer

The index_bases member index_bases returns a container with each dimension index base. The shape member function returns a container with each dimension (size). You can use both of these parameters to determine the range of indices for each dimension:

 typedef boost::multi_array<int, 3> array_type; void printArray(const array_type& a) { // Query extents of each array dimension index iMin = a.index_bases()[0]; index iMax = iMin + a.shape()[0] - 1; index jMin = a.index_bases()[1]; index jMax = jMin + a.shape()[1] - 1; index kMin = a.index_bases()[2]; index kMax = kMin + a.shape()[2] - 1; for (index i=iMin; i<=iMax; ++i) { for (index j=jMin; j<=jMax; ++j) { for (index k=kMin; k<=kMax; ++k) { std::cout << a[i][j][k] << " "; } } } } int main() { typedef array_type::extent_range range; typedef array_type::index index; array_type::extent_gen extents; // Extents are hard-coded here, but can come from user/disk. array_type a(extents[2][range(1,4)][range(-1,3)]); // Populate array with values... // Pass the array to a function. The function will query // the extents of the given array. print(a); return 0; } 
+5
source

Source: https://habr.com/ru/post/1395256/


All Articles