我有一个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,每个维的长度为size
(所以我可以写arr(samevaluearray(n,size))
),或者我错过了一个方便的MultiArray构造函数?
**编辑:**它应该不依赖于n的某个值,即arr({{size,size}}
只适用于n=2
。
因为它可能不清楚:boost::multi_array<char,n>(boost::extents[4][4][4])
正确地编译了一个4x4x4数组,但是每次在源代码中更改n
时,每次初始化都必须手动更新,所以这不是一个选项。
4条答案
按热度按时间sd2nnvve1#
你可以将数组的创建封装到一个helper函数中:
字符串
如果你不能使用
auto
,你必须复制模板参数:型
make_regular_matrix
函数可以缩短为使用std::vector
,就像你在回答中所做的那样;我不知道这样的实现是否会更好。助手函数的目的是隐藏数组的创建,但也可以编写其他版本,例如用给定的值初始化数组元素:型
n1bvdmb62#
原来,
std::vector
有一个构造函数,它构造一个具有重复n次的常量值的向量,因此可能的解决方案如下所示:字符串
这是一个n维的multi-array,每个维度的size都设置为size。
4dbbbstv3#
从Boost Multi-Array documentation,是的,你可以初始化它一行:
字符串
typedef是为了可读性,你可以很容易地为你的例子做:
型
ykejflvf4#
我认为这里的问题实际上是如何简单地生成具有单个值的常量静态数组。
字符串
或者在一行中(根据要求):
型
https://godbolt.org/z/Y4Gs5q54e