文档https://www.boost.org/doc/libs/1_73_0/libs/multi_array/doc/user.html#sec_generators
Boost.MultiArray 提供了创建现有数组组件的子视图的工具。它允许您创建一个子视图,该子视图保留与原始数组相同的维数,或者一个维数也比原始数组少的子视图。
子视图的创建是通过调用 operator[] 并传递给它一个 index_gen 类型来实现的。index_gen 通过将 index_range 对象传递给它的 operator[] 来填充。index_range 和 index_gen 类型在 multi_array_types 命名空间中定义,并作为每个数组类型的嵌套成员。与 boost::extents 类似,该库默认构造对象 boost::indices。您可以通过在包含库头之前定义 BOOST_MULTI_ARRAY_NO_GENERATORS 来抑制此对象。下面是一个简单的子视图创建示例。
样本:
住在科利鲁
#include <boost/multi_array.hpp>
#include <iostream>
template <typename Ma>
auto dump(Ma const& r) -> std::enable_if_t<1 == Ma::dimensionality> {
for (auto c: r)
std::cout << " " << c;
std::cout << "\n";
}
template <typename Ma>
auto dump(Ma const& ma) -> std::enable_if_t<2 == Ma::dimensionality> {
for (auto const& r: ma)
dump(r);
}
int main() {using range = boost::multi_array_types::index_range;
using boost::extents;
using boost::indices;
auto mn = extents[7][4];
boost::multi_array<int, 2> ma(mn);
// fill with numbers from 10..37
std::iota(ma.data(), ma.data() + ma.num_elements(), 10);
dump(ma);
std::cout << "Slice [3..5][1..3]\n";
dump(ma[ indices[range(3,5)][range(1,3)] ]);
std::cout << "Slice [2..4][2..3]\n";
dump(ma[ indices[range(2,4)][range(2,3)] ]);
std::cout << "Slice [1,3,5][2..3]\n";
dump(ma[ indices[range(1,7,2)][range(2,3)] ]);
std::cout << "Degenerate views (reduced dimensionality):\n";
std::cout << "Slice [1,3,5][2]\n";
dump(ma[ indices[range(1,7,2)][2] ]);
std::cout << "Slice [0][1,3]\n";
dump(ma[ indices[0][range(1,4,2)] ]);
}
印刷
10 11 12 13
14 15 16 17
18 19 20 21
22 23 24 25
26 27 28 29
30 31 32 33
34 35 36 37
Slice [3..5][1..3]
23 24
27 28
Slice [2..4][2..3]
20
24
Slice [1,3,5][2..3]
16
24
32
Degenerate views (reduced dimensionality):
Slice [1,3,5][2]
16 24 32
Slice [0][1,3]
11 13
更新
回覆。评论:
如果你想避免退化的尺寸,这里是如何:
住在科利鲁
std::cout << "Degenerate views (reduced dimensionality):\n";
std::cout << "Slice [1,3,5][2]\n";
dump(ma[ indices[range(1,7,2)][2] ]);
std::cout << "Slice [0][1,3]\n";
dump(ma[ indices[0][range(1,4,2)] ]);
// RE: Comment
std::cout << "NON-Degenerate views (reduced dimensionality):\n";
std::cout << "Slice [1,3,5][2]\n";
dump(ma[ indices[range(1,7,2)][range(2,3)] ]);
std::cout << "Slice [0][1,3]\n";
dump(ma[ indices[range(0,1)][range(1,4,2)] ]);
印刷
Degenerate views (reduced dimensionality):
Slice [1,3,5][2]
16 24 32
Slice [0][1,3]
11 13
NON-Degenerate views (reduced dimensionality):
Slice [1,3,5][2]
16
24
32
Slice [0][1,3]
11 13
基本上,不要使用文字[i][j]
,但是[range(i,i+1)][range(j,j+1)]