c – Boost.MultiArray的单行初始化程序

前端之家收集整理的这篇文章主要介绍了c – Boost.MultiArray的单行初始化程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个n维Boost.MultiArray我初始化如下:
const int n=3,size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr;
boost::array<size_t,n> extents; //size of each dimension
extents.assign(size); //assign size to each dimension -> {{4,4,4}}
arr.resize(extents);

所以我有4行代码来获得MultiArray,但我想在一行中完成.
是否有任何简单的方法生成具有n个维度的MultiArray,每个维度都有大小长度(所以我可以编写arr(samevaluearray(n,size)))或者我是否错过了MultiArray的方便构造函数

编辑:它应该在不依赖于某个n值的情况下工作,即arr({{size,size}}仅适用于n = 2.

由于可能不太清楚:boost :: multi_array< char,n>(boost :: extents [4] [4] [4])正确初始化4x4x4数组,但每次在源代码中更改n时,每次初始化必须手动更新,所以它不是一个选项.

解决方法

您可以将数组的创建封装到辅助函数中:
template <typename T,size_t N>
boost::multi_array<T,N> make_regular_matrix(const size_t m)
{
    boost::multi_array<T,N> arr;
    boost::array<size_t,N> extents;
    extents.assign(m);
    arr.resize(extents);

    return arr;
}

const int n = 3;
int size = 4; // Can be const as well,but this is not mandatory

auto arr = make_regular_matrix<char,n>(size);

如果您不能使用auto,则必须复制模板参数:

boost::multi_array<char,n> arr = make_regular_matrix<char,n>(size);

make_regular_matrix函数可以缩短为使用std :: vector,就像你在答案中所做的那样;我不知道这种实施是否会更好.辅助函数的目的是隐藏数组的创建,但是可以编写其他版本,例如使用给定值初始化数组元素:

template <size_t N,typename T> //switched order for deduction
boost::multi_array<T,N> make_regular_matrix(const size_t m,const T & value)
{
     boost::multi_array<T,N> arr(std::vector<size_t>(n,m));

     std::fill(arr.data(),arr.data() + arr.num_elements(),value);

     return arr;
}

auto arr = make_regular_matrix<4>(3,'z'); //creates a 3x3x3x3 matrix
                                           //filled with 'z's

猜你在找的C&C++相关文章