如何为boost multi_array动态设置维度

时间:2016-09-22 20:53:24

标签: c++ arrays boost

我有一个需要创建一个boost_array的函数,其维度不是先验已知的。但是,范围对于任何给定的维度都是已知的。如何逐步为我的数组构建一个范围对象?

类似的东西:

array_type::extent_gen<array_type::dimensionality> my_extents;
for (size_type d = 0; d < array_type::dimensionality; d++) {
    extents = extents[5];
}
array_type my_array(extents);

将一个尚未确定的数组设置为在每个维度中具有5的范围....

1 个答案:

答案 0 :(得分:0)

我认为你不能,因为multi_array的维度是在类型的模板参数中编码的:

typedef boost::multi_array<double, 3> array_type;

完全不同
typedef boost::multi_array<double, 2> array_type;

&#34; best&#34;你可能做的是

static const int MAX_DIMENSIONS = 10;
typedef boost::multi_array<double, MAX_DIMENSIONS> array_type;

然后构建范围以使&#34;未使用&#34;维度1的范围:

<强> Live On Coliru

#include <boost/multi_array.hpp>
#include <iostream>

static const int MAX_DIMENSIONS = 5;
typedef boost::multi_array<double, MAX_DIMENSIONS> array_type;

array_type make_array(int dims, int default_extent = 5) {
    boost::array<int, MAX_DIMENSIONS> exts = {};
    std::fill_n(exts.begin(), exts.size(), 1);
    std::fill_n(exts.begin(), dims, default_extent);

    return array_type(exts);
}

int main() {
    auto a = make_array(3);
    auto b = make_array(2);

    std::copy(a.shape(), a.shape() + a.dimensionality, std::ostream_iterator<size_t>(std::cout << "\na: ", " "));
    std::copy(b.shape(), b.shape() + b.dimensionality, std::ostream_iterator<size_t>(std::cout << "\nb: ", " "));
}

打印

a: 5 5 5 1 1 
b: 5 5 1 1 1