我有一个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